API REST

API REST vs GraphQL

API REST vs GraphQL

TL;versione DR

In uno dei post precedenti abbiamo discusso, in breve, di com'è utilizzare l'API GitHub v3. Questa versione è progettata per essere interfacciata come qualsiasi altra API REST. Esistono endpoint per ogni risorsa a cui è necessario accedere e/o modificare. Ci sono endpoint per ogni utente, ogni organizzazione, ogni repository e così via. Ad esempio, ogni utente ha il suo endpoint API su https://api.github.it/utenti/ puoi provare a sostituire il tuo nome utente invece di e inserisci l'URL in un browser per vedere con cosa risponde l'API.

GitHub API v4, d'altra parte, utilizza GraphQL dove QL sta per Query Language. GraphQL è un nuovo modo di progettare le tue API. Così come ci sono molti servizi web offerti come API REST non solo quelli offerti da GitHub, ci sono molti servizi web che ti permettono di interfacciarti con loro tramite GraphQL.

La differenza più netta che noterai tra GraphQL e API REST è che GraphQL può funzionare con un singolo endpoint API. In caso di GitHub API v4, questo punto finale è https://api.github.com/graphql e basta. Non devi preoccuparti di aggiungere lunghe stringhe alla fine di un URI radice o fornire un parametro stringa di query per ulteriori informazioni. Invii semplicemente un argomento simile a JSON a questa API, chiedendo solo le cose di cui hai bisogno, e otterrai un payload JSON con le stesse esatte informazioni che hai richiesto. Non devi occuparti di filtrare le informazioni indesiderate o soffrire di sovraccarico delle prestazioni a causa di risposte di grandi dimensioni.

Che cos'è l'API REST??

Bene, REST sta per Representational State Transfer e API sta per Application Programming Interface. Un'API REST, o un'API "RESTful", è diventata la filosofia di progettazione fondamentale alla base della maggior parte delle moderne applicazioni client-server. L'idea nasce dalla necessità di separare i vari componenti di un'applicazione come l'interfaccia utente lato client e la logica lato server.

Quindi la sessione tra un client e un server è tipicamente senza stato. Una volta caricata la pagina Web e i relativi script, è possibile continuare a interagire con essi e quando si esegue un'azione (come premere un pulsante di invio) viene inviata una richiesta di invio insieme a tutte le informazioni contestuali necessarie al server Web per elaborare tale richiesta ( come nome utente, token, ecc.). L'applicazione passa da uno stato all'altro ma senza una costante necessità di connessione tra client e server.

REST definisce un insieme di vincoli tra il client e il server e la comunicazione può avvenire solo sotto tali vincoli. Ad esempio REST su HTTP di solito utilizza il modello CRUD, che sta per Crea, Leggi, Aggiorna ed Elimina e metodi HTTP come POST, GET, PUT e DELETE ti aiutano a eseguire quelle operazioni e quelle operazioni da soli. Le vecchie tecniche di intrusione come le iniezioni SQL non sono una possibilità con qualcosa come un'API REST ben scritta (anche se REST non è una panacea per la sicurezza).

Aiuta anche molto gli sviluppatori dell'interfaccia utente! Poiché tutto ciò che ricevi da una richiesta HTTP è un tipico flusso di testo (formattato come JSON, a volte) puoi facilmente implementare una pagina Web per browser o un'app (nella tua lingua preferita) senza preoccuparti dell'architettura lato server. Leggi la documentazione dell'API per servizi come Reddit, Twitter o Facebook e puoi scrivere estensioni per loro o per client di terze parti nella lingua che preferisci poiché hai la garanzia che il comportamento dell'API sarà sempre lo stesso.

Al contrario, al server non importa se il front-end è scritto in Go, Ruby o Python. Che si tratti di un browser, app o CLI. Semplicemente "vede" la richiesta e risponde in modo appropriato.

Cos'è GraphQL?

Come con qualsiasi cosa nel mondo dei computer, le API REST sono diventate più grandi e complesse e allo stesso tempo le persone volevano implementarle e utilizzarle in modo più rapido e semplice. Questo è il motivo per cui Facebook ha avuto l'idea di GraphQL e in seguito l'ha reso open source. Il QL in GraphQL sta per Query Language.

GraphQL consente ai clienti di effettuare richieste API molto specifiche, invece di effettuare chiamate API rigide con parametri e risposte predefinite. È molto più semplice perché il server risponde con esattamente i dati che gli hai chiesto, senza eccessi.

Dai un'occhiata a questa richiesta REST e alla sua risposta corrispondente. Questa richiesta ha lo scopo di visualizzare solo la biografia pubblica di un utente.

Richiesta: GET https://api.github.it/utenti/
Risposta:

"login": "octocat",
"id": 583231,
"node_id": "MDQ6VXNlcjU4MzIzMQ==",
"avatar_url": "https://avatars3.githubusercontent.com/u/583231?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/octocat",
"html_url": "https://github.com/octocat",
"followers_url": "https://api.github.com/users/octocat/followers",
"following_url": "https://api.github.com/users/octocat/following/other_user",
"gists_url": "https://api.github.com/users/octocat/gists/gist_id",
"starred_url": "https://api.github.com/users/octocat/starred/owner/repo",
"subscriptions_url": "https://api.github.com/utenti/octocat/abbonamenti",
"organizations_url": "https://api.github.com/users/octocat/orgs",
"repos_url": "https://api.github.com/users/octocat/repos",
"events_url": "https://api.github.com/users/octocat/events/privacy",
"received_events_url": "https://api.github.com/users/octocat/received_events",
"tipo": "Utente",
"site_admin": falso,
"nome": "The Octocat",
"azienda": "GitHub",
"blog": "http://www.github.com/blog",
"luogo": "San Francisco",
"e-mail": null,
"affittabile": null,
"bio": nullo,
"public_repos": 8,
"public_gists": 8,
"seguaci": 2455,
"seguente": 9,
"created_at": "25/01/2011T18:44:36Z",
"updated_at": "2018-11-22T16:00:23Z"

Ho usato il nome utente octocat, ma puoi sostituirlo con il nome utente di tua scelta e utilizzare cURL per effettuare questa richiesta nella riga di comando o Postman se hai bisogno di una GUI. Sebbene la richiesta fosse semplice, pensa a tutte le informazioni extra che stai ricevendo da questa risposta. Se dovessi elaborare i dati di un milione di tali utenti e filtrare tutti i dati non necessari utilizzando, ciò non è efficiente. Stai sprecando larghezza di banda, memoria e calcolo per ottenere, archiviare e filtrare tutte le milioni di coppie chiave-valore in più che non avrai mai

Anche la struttura della risposta non è qualcosa che conosci in anticipo. Questa risposta JSON è equivalente all'oggetto dizionario in Python o a un oggetto in JavaScript. Altri endpoint risponderanno con oggetti JSON che possono essere composti da oggetti nidificati, elenchi nidificati all'interno dell'oggetto o qualsiasi combinazione arbitraria di tipi di dati JSON e sarà necessario fare riferimento alla documentazione per ottenere le specifiche. Quando stai elaborando la richiesta, devi essere consapevole di questo formato che cambia da endpoint a endpoint.

GraphQL non si basa su verbi HTTP come POST, GET, PUT e DELETE per eseguire operazioni CRUD sul server. Invece, c'è solo un tipo di tipo di richiesta HTTP e endopint per tutte le operazioni relative a CRUD. Nel caso di GitHub si tratta di richieste di tipo POST con un solo endpoint https://api.github.com/graphql

Essendo una richiesta POST può portare con sé un corpo di testo simile a JSON attraverso il quale saranno le nostre operazioni GraphQL. Queste operazioni possono essere di tipo interrogazione se tutto ciò che vuole fare è leggere alcune informazioni, o può essere un mutazione nel caso in cui i dati debbano essere modificati.

Per effettuare chiamate API GraphQL puoi utilizzare GraphQL explorer di GitHub. Dai un'occhiata a questo GraphQL interrogazione per recuperare lo stesso tipo di dati (la biografia pubblica di un utente) come abbiamo fatto sopra usando REST.

Richiesta: POST https://api.github.com/graphql
query
utente (login: "ranvo")
bio


 
Risposta:
 

"dati":
"utente":
"bio": "Appassionati di tecnologia e scienza. Mi piacciono tutti i tipi di cose non correlate da
server per la fisica quantistica.\r\nOccasionalmente, scrivo post sul blog sugli interessi di cui sopra."


Come puoi vedere, la risposta consiste solo in ciò che hai chiesto, questa è la biografia dell'utente. Seleziona un utente specifico passando il nome utente (nel mio caso, è ranvo) e poi chiedi il valore di un attributo di quell'utente, in questo caso quell'attributo è bio. Il server API cerca le informazioni specifiche esatte e risponde con quello e nient'altro.

D'altro canto, GraphQL ti consente anche di effettuare una singola richiesta ed estrarre informazioni che ti avrebbero richiesto più richieste nell'API REST tradizionale. Ricorda che tutte le richieste GraphQL vengono fatte a un solo endpoint API. Prendiamo ad esempio il caso d'uso in cui è necessario chiedere al server API GitHub la biografia dell'utente e una delle sue chiavi SSH. Richiederebbe due richieste GET.

Richieste REST: GET https://api.github.com//
OTTIENI https://api.github.com//tasti
 
Richiesta GraphQL: POST https://api.github.com/graphql/
 
query
utente (login: "ranvo")
bio
publicKeys (ultimo:1)
bordi
nodo
chiave





 
Risposta di GraphQL:
 

"dati":
"utente":
"bio": "Appassionati di tecnologia e scienza. Mi piacciono tutti i tipi di cose non correlate da
server per la fisica quantistica.\r\nOccasionalmente, scrivo post sul blog sugli interessi di cui sopra.",
"chiavi pubbliche":
"bordi": [

"nodo":
"chiave": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH31mVjRYdzeh8oD8jvaFpRuIgL65SwILyKpeGBUNGOT"


]



Esistono oggetti nidificati, ma se guardi la tua richiesta, corrispondono praticamente alla tua richiesta in modo che tu possa conoscere e, in un certo senso, modellare la struttura della risposta che ottieni .

Conclusione

GraphQL ha una propria curva di apprendimento, che è molto ripida o per niente ripida a seconda di chi stai chiedendo. Da un punto di vista oggettivo, posso esporre i seguenti fatti per te. È flessibile come hai visto sopra, è introspettivo - vale a dire, puoi interrogare l'API GraphQL sull'API stessa. Anche se non hai intenzione di creare il tuo server API utilizzandolo, è probabile che dovrai interfacciarti con un'API che consente solo GraphQL.

Puoi imparare un po 'di più sui suoi aspetti tecnici qui e se vuoi effettuare chiamate API GraphQL dalla tua workstation locale, usa Graphiql.

Porte open source di motori di gioco commerciali
Ricreazioni del motore di gioco gratuite, open source e multipiattaforma possono essere utilizzate per riprodurre titoli di giochi vecchi e abbastanza...
I migliori giochi da riga di comando per Linux
La riga di comando non è solo il tuo più grande alleato quando usi Linux, ma può anche essere una fonte di intrattenimento perché puoi usarla per gioc...
Le migliori app di mappatura del gamepad per Linux
Se ti piace giocare su Linux con un gamepad invece di un tipico sistema di input di tastiera e mouse, ci sono alcune app utili per te. Molti giochi pe...