Importazione di dati di servizi Web: la nuova richiesta HTTP in JMP ® 14 (US 2018 231)
Livello: Intermedio
Bryan Boone, sviluppatore software principale JMP, SAS
Enti governativi e privati stanno rendendo sempre più disponibili i propri dati su Internet tramite servizi RESTful. JMP 14 offre una nuova funzionalità chiamata HTTP Request , disponibile tramite JSL, che consente di accedere a questi servizi RESTful. Questo documento descrive cosa sono i servizi RESTful e fornisce diversi esempi su come utilizzare HTTP Request per importare nuovi dati in JMP.
Che cosa è REST
REST, o Representational State Transfer, è un modo per garantire l'interoperabilità tra sistemi informatici su Internet. Un servizio RESTful è un servizio basato sul web che utilizza questo paradigma. Un'API RESTful è un'interfaccia di programmazione applicativa (API) che utilizza richieste HTTP per GET , POST , PUT e DELETE per interagire con il servizio RESTful.
Il protocollo HTTP definisce un insieme di metodi HTTP di richiesta per indicare l'azione che un client desidera che un server esegua su una risorsa. Sono:
|
OTTENERE
|
Richiedi la risorsa
|
|
TESTA
|
Richiedi solo metadati delle risorse
|
|
INVIARE
|
Richieste di accettazione della risorsa
|
|
METTERE
|
Richieste di archiviazione o creazione della risorsa
|
|
ELIMINARE
|
Richieste di eliminazione della risorsa
|
|
TOPPA
|
Richiesta di modifica dello stato di una risorsa
|
Nuova terminologia, attività familiari
Potrebbero sembrare concetti completamente nuovi, ma hai già familiarità con due dei metodi di richiesta più comuni: OTTENERE e INVIARE .
OTTENERE
OTTENERE ha due personalità.
La prima personalità sta semplicemente OTTENERE -ting una risorsa. Ovvero, l'intento è semplicemente quello di accedere a una risorsa web. Questo è visibile nella Figura 1. Qui, il browser accede alla pagina web. 
Figure 1. “
OTTENERE
for a web resource”
Il secondo è OTTENERE -ting (accesso) a una risorsa, insieme a quella che è nota come query string. Una query string è un insieme di coppie chiave/valore definite dalla risorsa web e utilizzate dal client per richiedere al server di filtrare o modificare la richiesta OTTENERE utilizzando questi parametri. Questo è visibile nella Figura 2. Qui il browser chiede al server di modificare una richiesta OTTENERE utilizzando:
INVIARE
INVIARE , invece, è più complesso. Un INVIARE chiede al server di modificare o creare una risorsa. Un INVIARE contiene in genere un modulo HTML che a sua volta contiene una raccolta di coppie chiave/valore di dati di tipo carattere e/o coppie chiave/valore di file. La Figura 3 mostra un esempio che registra un utente su Amazon. Ecco le coppie chiave/valore:
|
E-mail
|
Accedi alla tua email
|
|
Password
|
La tua password
|
Il pulsante “Accedi” esegue l’ INVIARE
Figura 3. “Invia i dati del modulo INVIARE a una risorsa web”
Perché usarlo
Il protocollo HTTP ci permette di pensare alle superstrade dell'informazione come a un esempio: "Le autostrade sono asfaltate, i segnali stradali sono stati installati e i ponti sono stati costruiti". Lo standard ha permesso la nascita di nuove aziende di gestione dei dati. Inoltre, l'adozione dello standard HTTP ha eliminato i silos informativi che spesso si trovano nelle aziende consolidate. Alcune di queste aziende includono:
|
Text-Processing.com (dati sul sentiment)
|
Jenkins
|
|
C'è
|
L'HUB
|
|
Ufficio 365
|
Google
|
|
Cassetta di sicurezza
|
Un'unità
|
|
AWS (Amazon Web Services)
|
Ufficio del censimento degli Stati Uniti
|
|
IN
|
PubChem
|
|
New York Times
|
Fitbit
|
|
Yahoo
|
Bitcoin
|
|
Fumetti Marvel
|
SAS
|
|
OpenAQ
|
JMP
|
Come usarlo
JSON
JSON (JavaScript Object Notation) è un formato di scambio dati leggero. Si basa su un sottoinsieme del linguaggio di programmazione JavaScript. JSON è un formato di testo indipendente dal linguaggio, ma utilizza concetti già familiari alla maggior parte dei programmatori.
JSON è basato su due strutture:
- Una raccolta di coppie nome/valore. (dizionario, tabella hash, array associativo, …)
- Un elenco ordinato di valori. (array, vettore, elenco, ...)
Nuova terminologia, attività familiari (di nuovo)
JSL
JSL è il linguaggio di scripting preferito quando si utilizza JMP. JSON potrebbe essere un termine nuovo, ma JSL supporta le due strutture dati richieste da JSON.
Lista
Gli elenchi sono contenitori in cui archiviare elementi, come ad esempio:
- numeri
- variabili
- stringhe di caratteri
- espressioni (ad esempio, assegnazioni o chiamate di funzione)
- matrici
- elenchi annidati
Array associativo
- Un array associativo mappa chiavi univoche a valori che possono essere non univoci. Un array associativo è anche chiamato dizionario, mappa, mappa hash o tabella hash.
JSL contiene anche due funzioni specifiche per l'elaborazione JSON.
Analizza JSON
- Converte il testo JSON in un array associativo o in un elenco in base alla struttura dei dati JSON.
Come JSON Expr
- Restituisce una rappresentazione JSON dell'espressione.
Queste funzioni consentono all'autore dello script di convertire senza problemi da e verso contenitori JSL e JSON.
Richiesta HTTP
Richiesta HTTP è una novità di JMP 14. Originariamente, la tecnologia era stata creata per gestire l'interazione tra JMP e JMP Public. Ci si rese presto conto che aveva applicazioni che andavano oltre la pubblicazione dei dati su JMP Public e la tecnologia fu introdotta in JSL come Richiesta HTTP .
Nozioni di base sulla richiesta HTTP
Richiesta HTTP supporta perfettamente sia il protocollo http che https e incapsula gran parte del comportamento che ci si aspetterebbe da cURL.
"cURL viene utilizzato nelle righe di comando o negli script per trasferire dati. Viene utilizzato anche in automobili, televisori, router, stampanti, apparecchiature audio, telefoni cellulari, tablet, decoder, lettori multimediali e costituisce la spina dorsale del trasferimento Internet per migliaia di applicazioni software che interessano miliardi di persone ogni giorno."
Ancora più importante, si può pensare a Richiesta HTTP come al collante che lega le risorse web a JSL. In altre parole, Richiesta HTTP comunica con una risorsa web e consente allo script writer di elaborare le risposte in JSL. La complessità del JSL è controllata dall'autore.
I metodi HTTP più comuni utilizzati durante l'interazione con una risorsa web sono:
Utilizzo della richiesta HTTP in un'azione GET
Un'azione OTTENERE è probabilmente l'azione HTTP più comune nelle Richieste . Questa azione è di sola lettura e può importare dati in JMP.
Messaggi comuni per Richiesta HTTP :
-
"Metodo"
-
“URL”
-
“Stringa di query”
-
"Inviare"
Figure 4. “
Richiesta HTTP
OTTENERE
”
Le azioni Richiesta HTTP OTTENERE sono spesso accompagnate da una "Query String" per inviare parametri a una risorsa web. La Figura 5 utilizza una Richiesta HTTP con una "Query String" . In JSL, una "Query String" è un array associativo che mappa una chiave a un valore di carattere o a un elenco di valori di carattere. Quando viene eseguito lo script in Figura 5, l'URL verrà automaticamente espanso in:
http://quotes.rest/qod.json?category=inspire
Figure 5. “
Richiesta HTTP
OTTENERE
using a ‘
Stringa di query
”
Utilizzo della richiesta HTTP in un'azione POST
Le azioni di richiesta HTTP INVIARE sono spesso più complesse.
Messaggi comuni per Richiesta HTTP :
-
"Metodo"
-
“URL”
-
"Modulo"
-
“JSON”
-
"File"
-
“Macchia”
-
"Inviare"
La Figura 6 mostra i dati di un modulo HTTP di Richiesta . In JSL, i dati del modulo possono avere due attributi: "Fields" e/o "Files" . Entrambi sono array associativi JSL che mappano una chiave a un valore di carattere o a una lista di valori di carattere. Nel caso dei "Files" , il valore di carattere o la lista di valori di carattere corrispondono ai nomi dei file che si desidera aggiungere al modulo.
Figure 6. “
Richiesta HTTP
INVIARE
using a
Modulo
”
La Figura 7 mostra i dati " JSON" di una Richiesta HTTP . In JSL, "JSON" può essere un Array associativo o dati di tipo carattere in formato JSON. Poiché JSON Expr crea un oggetto JSON ben definito da utilizzare con la Richiesta HTTP . I dati JSON vengono inviati come corpo della richiesta. 
Figure 7. “
Richiesta HTTP
INVIARE
using ‘
JSON'
”
La Figura 8 mostra i dati di una Richiesta HTTP " File" . In JSL, "File" è il nome del file che si desidera inviare come corpo della richiesta. 
Figure 8. “
Richiesta HTTP
INVIARE
using ‘
File'
”
Un'ultima azione per i dati " Blob" della Richiesta HTTP . In JSL, "Blob" è un dato binario blob che si desidera inviare come corpo della richiesta. Ciò significa che non è necessario scrivere un file su disco prima di inviarlo come parte di una richiesta.
IL
OTTENERE
l'azione è la richiesta più semplice da fare mentre
INVIARE
è la più complessa. L'interazione tra
Richiesta HTTP
e la risorsa web è sempre definita dal server. Sebbene il protocollo HTTP sia uno standard ben definito, i dati (e le strutture dati) sono definiti per ogni singola risorsa web. In altre parole, l'API di OneDrive è diversa da quella di Dropbox, sebbene svolgano funzioni simili.
Restituire al mittente
I dati di un messaggio HTTP " Invia" di Richiesta possono essere dati di tipo carattere, dati blob binari o vuoti, a seconda della risorsa web. Il controllo " È vuoto" sui dati restituiti rappresenta il livello di analisi più grossolano (oltre a "nessuno"). Tuttavia, se è necessario un livello di analisi più dettagliato, è possibile utilizzare " È stringa" per verificare la presenza di dati di tipo carattere.
Per un livello di indagine ancora più dettagliato, è possibile utilizzare "Get MIME Type" . I tipi MIME più comuni sono disponibili nell'articolo " Elenco incompleto dei tipi MIME" nella sezione Riferimenti del documento.
Infine, se necessario, puoi analizzare i codici di stato HTTP di basso livello di una risorsa web utilizzando questi messaggi:
|
“Ha informazioni”
|
100-199
|
|
“Ha successo”
|
200-299
|
|
"Ha reindirizzamento"
|
300-399
|
|
"Ha un errore del client"
|
400-499
|
|
"Ha un errore del server"
|
500-599
|
|
"Ha un errore"
|
Presenta un errore del client o del server
|
|
"Ottieni stato"
|
Il codice di stato HTTP
|
Le descrizioni dei codici di stato HTTP si possono trovare nell'articolo Definizioni dei codici di stato nella sezione Riferimenti del documento.
Dove usarlo
Sebbene Richiesta HTTP sia in grado di elaborare dati di tipo carattere o dati blob binari da qualsiasi risorsa web, ci concentreremo sui dati di tipo carattere provenienti dai servizi RESTful, ovvero i dati JSON.
Questo è dolce
PubChem è una delle nuove società di gestione dati basate sullo standard di protocollo HTTP che utilizza REST. PubChem è stata fondata nel 2004 come fonte di dati chimici aperta presso i National Institutes of Health (NIH). Centinaia di fonti di dati provenienti da istituzioni come università, aziende farmaceutiche, agenzie governative e fornitori di prodotti chimici vengono utilizzate per aggiornare i record di PubChem ogni mese. Si tratta della più grande raccolta di informazioni chimiche pubblicamente disponibile.
PubChem suddivide le query di dati in sostanze, composti, analisi, ecc. Da lì, è possibile ottenere una vasta gamma di proprietà, descrizioni, dosi e altre caratteristiche di interesse.
Ho letto che si trattava di ingredienti M&M. 
Figura 9. “Ingredienti M&M semplici”
Ho scritto uno script JSL che ha creato una tabella dati JMP degli ingredienti degli M&M's semplici per vedere cosa contengono. Non sorprende che gli ingredienti fossero ricchi di coloranti artificiali.
Una rappresentazione parziale della tabella dati JMP appare così: 
Figura 10. “Tabella dati ingredienti M&M semplici parziali”
Quando viene eseguito lo script JSL, la Richiesta HTTP viene utilizzata per recuperare l'immagine della sostanza o del composto, nonché altre proprietà fornite dal servizio RESTful di PubChem. 
Figura 11. “Tabella dati parziale degli ingredienti M&M semplici con dati PubChem”
Gli URL del servizio RESTful di interesse sono:
( [NOME] è il nome della sostanza o del composto che si trova nelle Figure 9 e 10.)
Per recuperare i dati dell'immagine di un composto come il lattosio, la Richiesta HTTP si presenta così: 
Figura 12. “ OTTENERE l'immagine del lattosio da PubChem”

Figura 13. “
OTTENERE e visualizzazione dell'immagine del lattosio da PubChem”
La richiesta Lactose utilizza l'endpoint di PubChem per i composti. Qui vengono utilizzati due concetti aggiuntivi. Il primo è "Codifica URI" . La codifica URI, nota anche come codifica percentuale, garantisce che l'URL RESTful contenga solo caratteri ASCII (fortunatamente, Lactose li contiene). Il secondo concetto è "Ottieni tipo MIME" . Il risultato di questo endpoint PubChem è un dato binario blob (un'immagine PNG). Il controllo "Ottieni tipo MIME" garantisce che il blob sia effettivamente un PNG prima di essere utilizzato con "Nuova immagine", poiché questo endpoint restituirà dati di tipo carattere se non viene trovato alcun PNG.
Per recuperare il record completo del lattosio nei dati JSON, la Richiesta HTTP appare così:
Figura 14. “ OTTENERE -ing il record completo del lattosio da PubChem”
L'endpoint definito da PubChem specifica che il suffisso /JSON indica che il servizio RESTful deve restituire dati JSON, quindi non è necessario controllare il tipo MIME di "data" . Tuttavia, dobbiamo elaborare il JSON. Esistono [almeno] due modi per elaborare i dati " data" restituiti. Il primo è utilizzare "JSON To Data Table" . Questo tenterà di creare una tabella dati JMP dai dati "data" . Per dati rettangolari o tabellari, questo funziona bene (e velocemente). Tuttavia, non tutti i servizi RESTful restituiscono dati tabellari (PubChem è uno di quelli che non lo fa). Il secondo modo per elaborare i dati restituiti è "Parse JSON" . Questo crea un array JSL associativo . Ciò significa che non è necessario analizzare il JSON. Tuttavia, è necessario sapere come sono strutturati i dati restituiti. Ovvero, è necessario sapere se si tratta di una coppia chiave/valore o di una coppia chiave/valore. Non è così difficile come sembra, perché puoi catturare il JSON grezzo nel log JMP e usare qualsiasi editor JSON per esaminarne la struttura.
Una visualizzazione parziale dei dati JSON per il lattosio appare come segue: 
Figura 15. “Dati JSON parziali sul lattosio da PubChem”
Questo editor visualizza una rappresentazione affiancata di JSON grezzo con l'oggetto JSON corrispondente. Quando si esaminano i dati, un {..} in JSON, si pensi a un JSL Array associativo . Allo stesso modo, quando si incontra un [..], si pensi a una JSL Lista .
Utilizzando questa tecnica, è possibile modificare lo script del record completo mostrato nella Figura 14 e utilizzarlo per creare una tabella dati JMP per le proprietà del lattosio: 
Figura 16. “ OTTENERE -ing il record completo del lattosio da PubChem e creazione di “ props” una tabella dati”
Questo esempio utilizza Parse JSON per tradurre il JSON grezzo da PubChem in un array JSL associativo . Dopo aver analizzato la struttura dei dati JSON, ci rendiamo conto che ci interessano solo i dati "props" nel JSON del lattosio. Possiamo quindi utilizzare la familiare navigazione associativa dell'array JSL per recuperare la Lista JSL presente in "PC_Compounds". Vogliamo solo il primo elemento della lista (poiché la maggior parte degli " oggetti di scena" sono ripetuti).
I dati "props" sono un array JSL associativo , quindi possiamo usare Come JSON Expr per tradurre "props" in JSON e utilizzarlo in JSON per Datatable . Il risultato è in Figura 17. 
Figura 17. “Tabella dati delle proprietà parziali del lattosio”
Ricorda, Richiesta HTTP è solo un collante che collega le risorse web a JSL. Una volta inseriti i dati in JSL, puoi utilizzarlo in modo semplice o complesso, a seconda delle tue esigenze.
Qualcosa di cui meravigliarsi
Nel 2014, la Marvel Comics ha creato un servizio RESTful che permette agli utenti di accedere a 70 anni di informazioni sui fumetti. L'API della Marvel Comics è limitata solo dall'immaginazione dello scripter, quindi ovviamente ho dovuto registrarmi per ottenere una chiave e accedervi per vedere cosa riuscivo a trovare. Ho scritto una funzione JSL marvel:API che utilizza diverse colonne che esplorano l'universo Marvel.
Essendo un fan di Deadpool, ho eseguito una query iniziale che ha creato questa tabella di dati: 
Figura 18. “Tabella dati parziale di Deadpool.”
Questo ha smascherato 4 diversi personaggi di Deadpool nell'universo Marvel Comics. Ero interessato all'identità del primo personaggio e ho selezionato il gestore dell'evento "serie click" che avevo creato. Data l'origine del click, la funzione meraviglia:API può generare una nuova query alla Marvel il cui valore di ritorno illustra il punto in cui Deadpool si interseca nell'MCU. Ho limitato i risultati a 50 righe; tuttavia, sono riuscito a scoprire alcuni risultati interessanti. Ho eseguito una rapida analisi di distribuzione su " title" e "startYear" solo per vedere quando la popolarità di Deadpool è salita e scesa (e poi è risalita).
Figura 19. “Distribuzione parziale di Deadpool”.
La figura 19 mostra che nel 2007 Deadpool è comparso in molti titoli diversi della Marvel Comics, tra cui:
- Avengers: L'iniziativa (2007-2010)
- Cable e Deadpool
- Civil War: Universo degli X-Men.
L'interesse per Deadpool è nuovamente diminuito dopo il 2007, ma è ripreso (come si evince dall'analisi) dopo che Ryan Reynolds ha interpretato per la prima volta il personaggio in X-Men Origins: Wolverine (2009), rinnovando così l'interesse per il personaggio e raggiungendo l'apice nel 2011.
Nel periodo 2012-2015, l'universo dei fumetti Marvel esplode in Deadpool Kills the Marvel Universe, dando vita a un reboot Marvel.
Infine, nessuna sorpresa per il periodo 2016-2018. È allora che sono usciti i film.
Peter di Deadpool 2 riassume al meglio l'API della Marvel Comics: "Ho appena visto la pubblicità e ho pensato che sembrasse divertente".
Convenzioni utilizzate
Il termine servizio RESTful viene utilizzato quando la risorsa web è basata su REST
Il termine risorsa web è un termine generico utilizzato quando si fa riferimento a un accesso web generico.
Le azioni HTTP sono in grassetto
I pulsanti/controlli di dialogo sono " tra virgolette e in grassetto"
I collegamenti ipertestuali sono sottolineati
Gli oggetti e le funzioni JSL sono in corsivo
I nomi delle variabili/colonne/messaggi JSL sono " tra virgolette e in corsivo "
Riferimenti
Hawk, Sandro (16 dicembre 2011) REST recuperato da https://www.w3.org/2001/sw/wiki/REST
Definizioni dei metodi W3.org recuperate da https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
W3.org
Definizioni del codice di stato
retrieved
https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
Mozilla.org (13 maggio 2018) Metodi di richiesta HTTP recuperati da https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
JSON.org (2017, dicembre) Introduzione a JSON recuperato da https://www.json.org
JMP.com (12 luglio 2018) Elenco recuperato dahttps://www.jmp.com/support/help/14/lists.shtml
JMP.com (12 luglio 2018) Lavorare con array associativi recuperato da https://www.jmp.com/support/help/14/work-with-associative-arrays.shtml
Strumento da riga di comando e libreria CURL per il trasferimento di dati con URL recuperati da https://curl.haxx.se/
W3.org (22 gennaio 2015) Proteggere il Web , recuperato da https://www.w3.org/2001/tag/doc/web-https
W3.org (11 giugno 2014) HTTP - Hypertext Transfer Protocol recuperato da https://www.w3.org/Protocols/
Mozilla.org (2018, July 3)
Elenco incompleto dei tipi 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 Informazioni su PubChem recuperate da https://pubchemdocs.ncbi.nlm.nih.gov/
Ingredienti MMs.com recuperati da http://www.mms.com/us/nutrition
Riferimento alla codifica URL HTML di W3Schools.com recuperato da https://www.w3schools.com/tags/ref_urlencode.asp
Portale per sviluppatori Developer.marvel.com recuperato da https://developer.marvel.com/