Importation de données de service Web : nouvelle requête HTTP dans JMP® 14 (US 2018 231)
Niveau : Intermédiaire
Bryan Boone, développeur principal de logiciels JMP, SAS
Les entités gouvernementales et privées mettent de plus en plus leurs données à disposition sur Internet via des services RESTful. JMP 14 propose une nouvelle fonctionnalité appelée « Requête HTTP » , disponible via JSL, qui permet d'accéder à ces services RESTful. Cet article décrit ce que sont les services RESTful et fournit plusieurs exemples d'utilisation de la requête HTTP pour importer de nouvelles données dans JMP.
Qu'est-ce que REST
REST, ou Representational State Transfer, est un moyen d'assurer l'interopérabilité entre les systèmes informatiques sur Internet. Un service RESTful est un service web qui utilise ce paradigme. Une API RESTful est une interface de programmation d'application (API) qui utilise des requêtes HTTP pour obtenir , publier , mettre et supprimer des données afin d'interagir avec le service RESTful.
Le protocole HTTP définit un ensemble de méthodes de requête HTTP pour indiquer l'action qu'un client souhaite voir le serveur exécuter sur une ressource. Ces méthodes sont :
|
OBTENIR
|
Demander la ressource
|
|
TÊTE
|
Demander uniquement les métadonnées des ressources
|
|
POSTE
|
Demandes d'acceptation de la ressource
|
|
METTRE
|
Demandes de stockage ou de création de la ressource
|
|
SUPPRIMER
|
Demandes de suppression de la ressource
|
|
CORRECTIF
|
Demande de modification de l'état d'une ressource
|
Nouvelle terminologie, activités familières
Cela peut sembler être des concepts complètement nouveaux, mais vous connaissez déjà deux des méthodes de demande les plus courantes, OBTENIR et POSTE .
OBTENIR
OBTENIR a deux personnalités.
La première personnalité consiste simplement à OBTENIR une ressource. Autrement dit, l'intention est simplement d'accéder à une ressource web. Ceci est illustré à la figure 1. Ici, le navigateur accède à la page web. 
Figure 1. « OBTENIR pour une ressource Web »
La seconde méthode consiste à accéder à une ressource, via une chaîne de requête. Une chaîne de requête est un ensemble de paires clé/valeur définies par la ressource web et utilisées par le client pour demander au serveur de filtrer ou de modifier la requête OBTENIR à l'aide de ces paramètres. La figure 2 illustre ce processus. Ici, le navigateur demande au serveur de modifier une requête OBTENIR à l'aide de :
POSTE
POSTE , en revanche, est plus complexe. Une requête POSTE demande au serveur de modifier ou de créer une ressource. Elle contient généralement un formulaire HTML, lui-même composé d'un ensemble de paires clé/valeur de données textuelles et/ou de paires clé/valeur de fichiers. La figure 3 illustre la connexion d'un utilisateur à Amazon. Voici les paires clé/valeur :
|
E-mail
|
Votre e-mail de connexion
|
|
Mot de passe
|
Votre mot de passe
|
Le bouton « Connexion » effectue le POSTE
Figure 3. « Envoyer les données d'un formulaire POSTE à une ressource Web »
Pourquoi l'utiliser
Le protocole HTTP nous permet d'envisager les autoroutes de l'information comme « les routes sont pavées, les panneaux de signalisation sont en place et les ponts ont été construits ». La norme a permis la création de nouvelles entreprises de gestion de données. De plus, l'adoption de la norme HTTP a supprimé les silos d'information souvent présents dans les entreprises établies. Parmi ces entreprises, on trouve :
|
Text-Processing.com (données de sentiment)
|
Jenkins
|
|
Il y a
|
Le HUB
|
|
Office 365
|
Google
|
|
Boîte de dépôt
|
Un lecteur
|
|
AWS (Amazon Web Services)
|
Bureau du recensement des États-Unis
|
|
DANS
|
PubChem
|
|
New York Times
|
Fitbit
|
|
Yahoo
|
Bitcoin
|
|
Marvel Comics
|
SAS
|
|
OpenAQ
|
JMP
|
Comment l'utiliser
JSON
JSON (JavaScript Object Notation) est un format d'échange de données léger. Il est basé sur un sous-ensemble du langage de programmation JavaScript. JSON est un format texte indépendant du langage, mais qui utilise des concepts familiers à la plupart des programmeurs.
JSON est construit sur deux structures :
- Une collection de paires nom/valeur. (dictionnaire, table de hachage, tableau associatif, …)
- Une liste ordonnée de valeurs. (tableau, vecteur, liste, ...)
Nouvelle terminologie, activités familières (à nouveau)
JSL
JSL est le langage de script privilégié lorsque JMP est utilisé. JSON est peut-être un terme nouveau, mais JSL prend en charge les deux structures de données requises par JSON.
Liste
Les listes sont des conteneurs permettant de stocker des éléments, tels que les suivants :
- Nombres
- variables
- chaînes de caractères
- expressions (par exemple, affectations ou appels de fonctions)
- matrices
- listes imbriquées
Tableau associatif
- Un tableau associatif associe des clés uniques à des valeurs qui peuvent être non uniques. Un tableau associatif est également appelé dictionnaire, table de hachage ou table de hachage.
JSL contient également deux fonctions spécifiques au traitement JSON.
Analyser JSON
- Convertit le texte JSON en un tableau ou une liste associative en fonction de la structure des données JSON.
En tant qu'expression JSON
- Renvoie une représentation JSON de l'expression.
Ces fonctions permettent au rédacteur de script d'effectuer des conversions transparentes vers et depuis des conteneurs JSL et JSON.
Requête HTTP
Requête HTTP est une nouveauté de JMP 14. Initialement conçue pour gérer l'interaction entre JMP et JMP Public, cette technologie a rapidement pris conscience de ses applications autres que la publication de données sur JMP Public et a été intégrée à JSL sous le nom de Requête HTTP .
Introduction aux requêtes HTTP
Requête HTTP prend en charge de manière transparente les protocoles http et https et encapsule une grande partie du comportement que vous attendez de cURL.
cURL est utilisé dans les lignes de commande ou les scripts pour transférer des données. Il est également présent dans les voitures, les téléviseurs, les routeurs, les imprimantes, les équipements audio, les téléphones portables, les tablettes, les décodeurs, les lecteurs multimédias et constitue l'infrastructure de transfert Internet de milliers d'applications logicielles qui affectent des milliards d'utilisateurs chaque jour.
Plus important encore, Requête HTTP peut être considéré comme le lien entre les ressources web et JSL. Autrement dit, Requête HTTP communique avec une ressource web et permet au rédacteur du script de traiter les réponses en JSL. La complexité du JSL est contrôlée par l'auteur.
Les méthodes HTTP les plus courantes que vous utilisez lors de l'interaction avec une ressource Web sont :
Utilisation d'une requête HTTP dans une action GET
L'action OBTENIR est probablement l'action HTTP Requête la plus courante. Il s'agit d'une action en lecture seule permettant d'importer des données dans JMP.
Common messages for
Requête HTTP
:
-
"Méthode"
-
« URL »
-
« Chaîne de requête »
-
"Envoyer"
Figure 4. “
Requête HTTP
OBTENIR
”
Les actions Requête HTTP OBTENIR sont souvent accompagnées d'une chaîne de requête pour envoyer des paramètres à une ressource web. La figure 5 utilise une Requête HTTP avec une chaîne de requête . En JSL, une chaîne de requête est un tableau associatif qui associe une clé à une valeur de caractère ou à une liste de valeurs de caractère. Lors de l'exécution du script de la figure 5, l'URL est automatiquement étendue comme suit :
http://quotes.rest/qod.json?category=inspire
Figure 5. “
Requête HTTP
OBTENIR
using a ‘
Chaîne de requête'
”
Utilisation d'une requête HTTP dans une action POST
Les actions de requête HTTP POSTE sont souvent plus complexes.
Common messages for
Requête HTTP
:
-
"Méthode"
-
« URL »
-
"Formulaire"
-
« JSON »
-
"Déposer"
-
"Goutte"
-
"Envoyer"
La figure 6 illustre les données d'un formulaire HTTP de requête . En JSL, les données de formulaire peuvent avoir deux attributs : « Champs » et/ou « Fichiers » . Ce sont tous deux des tableaux associatifs JSL qui associent une clé à une valeur de caractère ou à une liste de valeurs de caractère. Dans le cas des « Fichiers » , la valeur de caractère ou la liste de valeurs de caractère correspond aux noms de fichiers à ajouter au formulaire.
Figure 6. “
Requête HTTP
POSTE
using a
Formulaire
”
La figure 7 illustre une requête HTTP de données « JSON » . En JSL, « JSON » peut être un associatif Tableau ou une donnée de type caractère au format JSON. L'expression JSON crée un objet JSON bien défini à utiliser avec la requête HTTP . Les données JSON sont envoyées dans le corps de la requête. 
Figure 7. “
Requête HTTP
POSTE
using ‘
JSON'
”
La figure 8 montre les données d'une requête HTTP « Fichier » . En JSL, « Fichier » correspond au nom du fichier à envoyer dans le corps de la requête. 
Figure 8. “
Requête HTTP
POSTE
using ‘
Déposer'
”
Une dernière action pour les données « Blob » de la requête HTTP . En JSL, « Blob » désigne les données binaires que vous souhaitez envoyer dans le corps de la requête. Cela signifie que vous n'avez pas besoin d'écrire un fichier sur le disque avant de l'envoyer dans le cadre d'une requête.
Le
OBTENIR
l'action est la demande la plus simple à faire pendant
POSTE
est la plus complexe. L'interaction entre
Requête HTTP
La ressource web est toujours définie par le serveur. Bien que le protocole HTTP soit une norme bien établie, les données (et leurs structures) sont définies ressource web par ressource. Autrement dit, l'API de One Drive est différente de celle de Dropbox, bien que leurs fonctions soient similaires.
Retour à l'expéditeur
Les données d'un message HTTP « Envoyer » de requête peuvent être des données de type caractère, des données binaires blob ou vides, selon la ressource web. Vérifier « Est vide » sur les données renvoyées constitue le niveau d'analyse le plus approximatif (outre « aucun »). Cependant, si vous avez besoin d'une analyse plus fine, vous pouvez utiliser « Est une chaîne » pour vérifier les données de type caractère.
Pour une analyse encore plus fine, vous pouvez utiliser « Obtenir le type MIME » . Les types MIME courants sont répertoriés dans la liste incomplète des types MIME, dans la section Références de cet article.
Enfin, si nécessaire, vous pouvez examiner les codes d’état HTTP de bas niveau à partir d’une ressource Web à l’aide de ces messages :
|
« A des informations »
|
100-199
|
|
« Est un succès »
|
200-299
|
|
« A une redirection »
|
300-399
|
|
« A une erreur client »
|
400-499
|
|
« A une erreur de serveur »
|
500-599
|
|
« A une erreur »
|
Il y a une erreur client ou serveur
|
|
« Obtenir le statut »
|
Le code d'état HTTP
|
Les descriptions des codes d'état HTTP peuvent être trouvées dans l'article Définitions des codes d'état dans la section Référence du document.
Où l'utiliser
Bien que Requête HTTP soit capable de traiter des données de type caractère ou des données binaires blob provenant de n'importe quelle ressource Web, nous allons nous concentrer sur les données de type caractère provenant de services RESTful, à savoir les données JSON.
C'est mignon
PubChem est l'une des nouvelles sociétés de gestion de données fondées sur la norme HTTP utilisant REST. Créée en 2004 par les National Institutes of Health (NIH), PubChem est une source de données chimiques ouverte. Des centaines de sources de données provenant d'institutions telles que des universités, des laboratoires pharmaceutiques, des agences gouvernementales et des fournisseurs de produits chimiques sont utilisées pour mettre à jour les données PubChem chaque mois. Il s'agit de la plus grande collection d'informations chimiques accessibles au public.
PubChem décompose ses requêtes de données en substances, composés et dosages, etc. À partir de là, vous pouvez obtenir une vaste gamme de propriétés, de descriptions, de doses et d'autres caractéristiques intéressantes.
J'ai lu cela comme ingrédients de M&M. 
Figure 9. « Ingrédients des M&M's nature »
J'ai écrit un script JSL qui a créé une table de données JMP des ingrédients des M&M's nature pour en connaître la composition. Sans surprise, ces ingrédients contenaient beaucoup de colorants artificiels.
Une représentation de table de données partielles JMP ressemble à ceci : 
Figure 10. « Tableau partiel des ingrédients des M&M's nature »
Lorsque le script JSL est exécuté, Requête HTTP est utilisé pour récupérer l'image de la substance ou du composé ainsi que d'autres propriétés fournies par le service RESTful de PubChem. 
Figure 11. « Tableau de données partielles sur les ingrédients des M&M's nature avec données PubChem »
Les URL de service RESTful intéressantes sont :
( [NOM] est le nom de la substance ou du composé trouvé dans les figures 9 et 10.)
Pour récupérer les données d'image d'un composé comme le lactose, la requête HTTP ressemble à ceci : 
Figure 12. « OBTENIR l'image du lactose à partir de PubChem »

Figure 13. «
OBTENIR et afficher l'image du lactose à partir de PubChem »
La requête Lactose utilise le point de terminaison PubChem pour le composé. Deux concepts supplémentaires sont utilisés ici. Le premier est Encode URI . Le codage URI, également appelé Percent Encoding, garantit que l'URL RESTful ne contient que des caractères ASCII (heureusement, c'est le cas de Lactose). Le second concept est « Obtenir le type MIME » . Le retour de ce point de terminaison PubChem est un blob binaire (une image PNG). La vérification « Obtenir le type MIME » garantit que le blob est bien au format PNG avant son utilisation avec New Image, car ce point de terminaison renvoie des données de type caractère si aucun PNG n'est trouvé.
Pour récupérer l'enregistrement complet du lactose dans les données JSON, la requête HTTP ressemble à ceci :
Figure 14. « OBTENIR le dossier complet de Lactose à partir de PubChem »
Le point de terminaison défini par PubChem spécifie que le suffixe /JSON indique que le service RESTful doit renvoyer des données JSON. Il n'est donc pas nécessaire de vérifier le type MIME de « data » . Cependant, nous devons traiter le JSON. Il existe au moins deux façons de traiter les « data » renvoyées. La première consiste à utiliser « JSON To Data Table » . Cette méthode tente de créer une table de données JMP à partir des « data » . Pour les données rectangulaires ou tabulaires, cette méthode est efficace (et rapide). Cependant, tous les services RESTful ne renvoient pas de données tabulaires (PubChem ne le fait pas). La deuxième méthode consiste à « Analyser JSON » . Cela crée un tableau associatif JSL. Cela signifie que vous n'avez pas besoin d'analyser le JSON. Cependant, vous devez connaître la structure des données renvoyées, c'est-à-dire savoir s'il s'agit d'une paire clé/valeur ou d'une paire clé/valeurs. Ce n’est pas aussi difficile qu’il y paraît puisque vous pouvez capturer le JSON brut dans le journal JMP et utiliser n’importe quel éditeur JSON pour examiner sa structure.
Un affichage partiel des données JSON pour le lactose ressemble à ceci : 
Figure 15. « Données JSON partielles sur le lactose de PubChem »
Cet éditeur affiche une représentation côte à côte du JSON brut et de l'objet JSON correspondant. Lorsque vous examinez les données, un {..} dans JSON, pensez à JSL Tableau associatif . De même, lorsque vous rencontrez un [..], pensez à JSL Liste .
En utilisant cette technique, vous pouvez modifier le script d'enregistrement complet illustré dans la figure 14 et l'utiliser pour créer une table de données JMP pour les propriétés du lactose : 
Figure 16. « OBTENIR l'enregistrement complet du lactose à partir de PubChem et créer un tableau de données avec « props » »
Cet exemple utilise Parse JSON pour traduire le JSON brut de PubChem en un associatif Tableau JSL. Après avoir examiné la structure des données JSON, nous nous rendons compte que seules les données « accessoires » du JSON Lactose nous intéressent. Nous pouvons alors utiliser la navigation associative Tableau JSL habituelle pour récupérer la liste JSL trouvée dans « PC_Compounds ». Nous ne souhaitons conserver que le premier élément de la liste (car la plupart des « accessoires » sont répétés).
Les données « Props » sont des données associatives JSL Tableau . Nous pouvons donc utiliser « En tant qu'expression JSON » pour traduire les « props » en JSON et les utiliser dans JSON pour Datatable . Le résultat est présenté dans la figure 17. 
Figure 17. « Tableau de données sur les propriétés partielles du lactose »
N'oubliez pas que Requête HTTP n'est qu'un simple lien entre les ressources web et JSL. Une fois vos données intégrées au JSL, vous pouvez les utiliser de manière simple ou complexe, selon vos besoins.
De quoi s'émerveiller
En 2014, Marvel Comics a créé un service RESTful permettant aux utilisateurs d'accéder à 70 ans d'informations sur les comics. L'API Marvel Comics n'a de limite que l'imagination du scripteur ; j'ai donc dû m'inscrire pour obtenir une clé et l'utiliser pour voir ce que je pouvais trouver. J'ai donc écrit une fonction JSL marvel:API qui utilise différentes colonnes pour explorer l'univers Marvel.
En tant que fan de Deadpool que je suis, j'ai posé une requête initiale qui a créé ce tableau de données : 
Figure 18. « Tableau de données partiel de Deadpool. »
Cela a permis de démasquer quatre personnages Deadpool différents dans l'univers Marvel Comics. Je me suis intéressé à l'identité du premier personnage et j'ai sélectionné le gestionnaire d'événements de clic de la série que j'avais créé. Compte tenu de l'origine du clic, la fonction merveille:API peut générer une nouvelle requête vers Marvel dont la valeur de retour illustre le croisement de Deadpool dans le MCU. J'ai limité les résultats à 50 lignes ; j'ai cependant pu découvrir des résultats intéressants. J'ai effectué une rapide analyse de distribution sur « title » et « startYear » afin de déterminer les périodes de hausse et de baisse (et de remontée) de la popularité de Deadpool.
Figure 19. « Distribution partielle de Deadpool ».
La figure 19 montre qu'en 2007, Deadpool a été intégré à de nombreux titres Marvel Comics, notamment :
- Avengers : L'Initiative (2007-2010)
- Câble et Deadpool
- Civil War : Univers X-Men.
L'intérêt pour Deadpool a de nouveau diminué après 2007, mais a repris (comme le montre l'analyse) après que Ryan Reynolds a joué le personnage pour la première fois dans X-Men Origins: Wolverine (2009), ce qui a renouvelé l'intérêt pour le personnage, atteignant un pic en 2011.
En 2012-2015, l'univers Marvel Comics explose dans Deadpool Kills the Marvel Universe pour un reboot Marvel.
Finalement, pas de surprise pour la période 2016-2018. C'est à cette époque que les films sont sortis.
Peter de Deadpool 2 résume le mieux l'API Marvel Comics : « Je viens de voir la publicité et j'ai trouvé que ça avait l'air amusant ».
Conventions utilisées
Le terme service RESTful est utilisé lorsque la ressource Web est basée sur REST
Le terme ressource Web est un terme générique utilisé lorsqu'un accès Web générique est implicite.
Les actions HTTP sont en gras
Les boutons/contrôles de boîte de dialogue sont « entre guillemets et en gras »
Les hyperliens sont soulignés
Les objets et fonctions JSL sont en italique
Les noms des variables/colonnes/messages JSL sont « entre guillemets et en italique »
Références
Hawk, Sandro (16 décembre 2011) REST récupéré de https://www.w3.org/2001/sw/wiki/REST
Définitions des méthodes W3.org récupérées à partir de https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
W3.org
Définitions des codes d'état
retrieved
https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
Mozilla.org (13 mai 2018) Méthodes de requête HTTP récupérées à partir de https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
JSON.org (2017, décembre) Présentation de JSON récupéré à partir de https://www.json.org
JMP.com (12 juillet 2018) Listes récupérées à partir dehttps://www.jmp.com/support/help/14/lists.shtml
JMP.com (12 juillet 2018) Travailler avec des tableaux associatifs (extrait de https://www.jmp.com/support/help/14/work-with-associative-arrays.shtml)
Outil de ligne de commande et bibliothèque CURL pour transférer des données avec des URL récupérées à partir de https://curl.haxx.se/
W3.org (22 janvier 2015) Sécuriser le Web récupéré de https://www.w3.org/2001/tag/doc/web-https
W3.org (11 juin 2014) HTTP - Protocole de transfert hypertexte récupéré à partir de https://www.w3.org/Protocols/
Mozilla.org (2018, July 3)
Liste incomplète des types MIME
retrieved from
https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types
PubChem.ncbi.nlm.nih.gov À propos de PubChem récupéré de https://pubchemdocs.ncbi.nlm.nih.gov/
Ingrédients MMs.com récupérés à partir de http://www.mms.com/us/nutrition
Référence d'encodage d'URL HTML de W3Schools.com récupérée à partir de https://www.w3schools.com/tags/ref_urlencode.asp
Portail des développeurs Developer.marvel.com récupéré à partir de https://developer.marvel.com/