Expressions JMESPath dans le kitAWS SDK for PHPVersion 3 - AWS SDK for PHP

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

JMESPath vous permet de spécifier par déclaration comment extraire des éléments d’un document JSON. LeAWS SDK for PHPa une dépendance àjmespath.phppour alimenter certaines des abstractions de haut niveau, commeProgrammes de pagination dans le kitAWS SDK for PHPVersion 3etProgrammes d'attente du kitAWS SDK for PHPVersion 3, mais expose également la recherche JMesPath surAws\ResultInterfaceetAws\ResultPaginator.

Vous pouvez commencer à utiliser JMESPath dans votre navigateur en essayant les exemples JMESPath en ligne. Pour en savoir plus sur la langue, y compris les expressions et fonctions disponibles, consultez la spécification JMESPath.

LeAWS CLIprend en charge JMESPath. Les expressions écrites pour la sortie CLI sont entièrement compatibles avec les expressions écrites pour le kit AWS SDK for PHP.

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\ResultPaginatorles 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 sur l’itérateur dans lequel le résultat d’une expression JMESPath est la fonction 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); }