Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Expressions JMESPath dans le kitAWS SDK for PHPVersion 3
JMESPathAws\ResultInterface
etAws\ResultPaginator
.
Vous pouvez commencer à utiliser JMESPath dans votre navigateur en essayant les exemples JMESPath
LeAWS CLI
Extraction de données depuis des résultats
L'interface Aws\ResultInterface
dispose d'une méthode search($expression)
permettant d'extraire des données à partir d'un modèle de résultat basé sur une expression JMESPath. Utiliser des expressions JMESPath pour interroger les données d'un objet de résultat peut vous aider à supprimer le code conditionnel réutilisable et à exprimer de manière plus concise les données extraites.
Pour illustrer son fonctionnement, nous commencerons avec la sortie JSON par défaut ci-dessous, qui décrit deux volumes Amazon Elastic Block Store (Amazon EBS) attachés à des instances Amazon EC2 distinctes.
$result = $ec2Client->describeVolumes(); // Output the result data as JSON (just so we can clearly visualize it) echo json_encode($result->toArray(), JSON_PRETTY_PRINT);
{ "Volumes": [ { "AvailabilityZone": "us-west-2a", "Attachments": [ { "AttachTime": "2013-09-17T00:55:03.000Z", "InstanceId": "i-a071c394", "VolumeId": "vol-e11a5288", "State": "attached", "DeleteOnTermination": true, "Device": "/dev/sda1" } ], "VolumeType": "standard", "VolumeId": "vol-e11a5288", "State": "in-use", "SnapshotId": "snap-f23ec1c8", "CreateTime": "2013-09-17T00:55:03.000Z", "Size": 30 }, { "AvailabilityZone": "us-west-2a", "Attachments": [ { "AttachTime": "2013-09-18T20:26:16.000Z", "InstanceId": "i-4b41a37c", "VolumeId": "vol-2e410a47", "State": "attached", "DeleteOnTermination": true, "Device": "/dev/sda1" } ], "VolumeType": "standard", "VolumeId": "vol-2e410a47", "State": "in-use", "SnapshotId": "snap-708e8348", "CreateTime": "2013-09-18T20:26:15.000Z", "Size": 8 } ], "@metadata": { "statusCode": 200, "effectiveUri": "https:\/\/ec2.us-west-2.amazonaws.com", "headers": { "content-type": "text\/xml;charset=UTF-8", "transfer-encoding": "chunked", "vary": "Accept-Encoding", "date": "Wed, 06 May 2015 18:01:14 GMT", "server": "AmazonEC2" } } }
Tout d'abord, nous pouvons récupérer uniquement le premier volume de la liste Volumes à l'aide de la commande suivante.
$firstVolume = $result->search('Volumes[0]');
Nous allons maintenant utiliser l'expression wildcard-index
[*]
pour parcourir l'ensemble de la liste, extraire, puis renommer trois éléments : VolumeId
est renommé ID
, AvailabilityZone
est renommé AZ
et Size
reste Size
. Nous pouvons extraire et renommer ces éléments à l'aide d'une expression multi-hash
placée après l'expression wildcard-index
.
$data = $result->search('Volumes[*].{ID: VolumeId, AZ: AvailabilityZone, Size: Size}');
Nous obtenons ainsi un tableau de données PHP comme suit :
array(2) { [0] => array(3) { 'AZ' => string(10) "us-west-2a" 'ID' => string(12) "vol-e11a5288" 'Size' => int(30) } [1] => array(3) { 'AZ' => string(10) "us-west-2a" 'ID' => string(12) "vol-2e410a47" 'Size' => int(8) } }
Dans la notation multi-hash
, vous pouvez également utiliser des clés de chaînes comme key1.key2[0].key3
pour extraire des éléments profondément imbriqués au sein de la structure. L'exemple suivant illustre ce processus avec la clé Attachments[0].InstanceId
, dont l'alias est simplement InstanceId
. (Dans la plupart des cas, les expressions JMESPath ignoreront les espaces.)
$expr = 'Volumes[*].{ID: VolumeId, InstanceId: Attachments[0].InstanceId, AZ: AvailabilityZone, Size: Size}'; $data = $result->search($expr); var_dump($data);
L'expression précédente générera les données suivantes :
array(2) { [0] => array(4) { 'ID' => string(12) "vol-e11a5288" 'InstanceId' => string(10) "i-a071c394" 'AZ' => string(10) "us-west-2a" 'Size' => int(30) } [1] => array(4) { 'ID' => string(12) "vol-2e410a47" 'InstanceId' => string(10) "i-4b41a37c" 'AZ' => string(10) "us-west-2a" 'Size' => int(8) } }
Vous pouvez également filtrer plusieurs éléments avec l'expression multi-list
:[key1, key2]
. Cette opération met en forme tous les attributs filtrés dans une seule liste ordonnée par objet, quel que soit le type.
$expr = 'Volumes[*].[VolumeId, Attachments[0].InstanceId, AvailabilityZone, Size]'; $data = $result->search($expr); var_dump($data);
Exécuter la recherche précédente génère les données suivantes :
array(2) { [0] => array(4) { [0] => string(12) "vol-e11a5288" [1] => string(10) "i-a071c394" [2] => string(10) "us-west-2a" [3] => int(30) } [1] => array(4) { [0] => string(12) "vol-2e410a47" [1] => string(10) "i-4b41a37c" [2] => string(10) "us-west-2a" [3] => int(8) } }
Utilisez une expression filter
pour filtrer les résultats sur la valeur d'un champ spécifique. L'exemple de requête suivant produit en sortie uniquement des volumes dans la zone de disponibilité us-west-2a
.
$data = $result->search("Volumes[?AvailabilityZone ## 'us-west-2a']");
JMESPath prend également en charge les expressions de fonction. Supposons que vous souhaitiez exécuter la même requête que ci-dessus, mais en récupérant tous les volumes dans lesquels le volume se trouve dans unAWSRégion qui commence par « nous- ». L'expression suivante utilise la fonction starts_with
, transmettant un littéral de chaîne de us-
. Le résultat de cette fonction est ensuite comparé à la valeur JSON littérale de true
, transmettant uniquement les résultats du prédicat de filtre ayant renvoyés true
via la projection de filtre.
$data = $result->search('Volumes[?starts_with(AvailabilityZone, 'us-') ## `true`]');
Extraction de données depuis des paginateurs
Comme vous le savez grâce auProgrammes de pagination dans le kitAWS SDK for PHPVersion 3guide,Aws\ResultPaginator
les objets sont utilisés pour générer des résultats à partir d'une opération d'API paginable. Le kit AWS SDK for PHP vous permet d’extraire et de parcourir des données filtrées à partir d’objets Aws\ResultPaginator
, implémentant essentiellement une flat-map
Supposons que vous souhaitiez créer un iterator
générant uniquement des objets de taille supérieure à 1 Mo à partir d'un compartiment. Cette opération peut être réalisée en créant un programme de pagination ListObjects
, puis en appliquant une fonction search()
au programme de pagination et en créant un itérateur « flat-mappé » sur les données paginées.
$result = $s3Client->getPaginator('ListObjects', ['Bucket' => 't1234']); $filtered = $result->search('Contents[?Size > `1048576`]'); // The result yielded as $data will be each individual match from // Contents in which the Size attribute is > 1048576 foreach ($filtered as $data) { var_dump($data); }