REST API vs Graphql

REST API vs Graphql

TL; versione DR

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

GitHub API V4, d'altra parte, usa GraphQL in cui il QL sta per il linguaggio delle query. Graphql è un nuovo modo di progettare le tue API. Proprio come ci sono molti servizi Web offerti come API REST non solo quelle offerte da GitHub, ci sono molti servizi Web che ti consentono di interfacciarsi con loro tramite graphql.

La differenza più netta che noterai tra GraphQL e REST API è che GraphQL può funzionare con un singolo endpoint API. In caso di API V4 GitHub, questo punto finale è https: // API.github.com/graphql e questo è quello. Non devi preoccuparti di aggiungere lunghe stringhe alla fine di un URI radice o fornire un parametro di stringa di query per ulteriori informazioni. Invia semplicemente un argomento 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 del filtraggio di informazioni indesiderate o soffrire di sovraccarico di prestazioni a causa di grandi risposte.

Cos'è API REST?

Bene, REST sta per il trasferimento di stato rappresentativo e l'acportazione API per l'interfaccia di programmazione dell'applicazione. Un'API REST, o un'API "riposante", è diventata la filosofia di design principale dietro la maggior parte delle moderne applicazioni di server client. L'idea emerge dalla necessità di separare vari componenti di un'applicazione come l'interfaccia utente lato client e la logica sul lato server.

Quindi la sessione tra un client e un server è in genere stato senza stato. Una volta caricati la pagina Web e gli script correlati, puoi continuare a interagire con loro e quando si esegue un'azione (come premere un pulsante di invio), viene inviata una richiesta di invio insieme a tutte le informazioni contestuali che il server Web deve elaborare tale richiesta ( Come il nome utente, i gettoni, ecc.). L'applicazione passa da uno stato a un altro ma senza costante necessità di connessione tra il client e il server.

Il riposo definisce una serie di vincoli tra il client e il server e la comunicazione può avvenire solo sotto tali vincoli. Ad esempio, il riposo su HTTP di solito utilizza il modello CRUD, che sta per creare, leggere, aggiornare ed eliminare e metodi HTTP come POST, GET, PUT ed ELETE AIUTO THE ESEGUI. Le vecchie tecniche di intrusione come le iniezioni di SQL non sono una possibilità con qualcosa come un'API di riposo ben scritta (sebbene il riposo non sia una panacea di sicurezza).

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

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

Cos'è graphql?

Come per qualsiasi cosa nel mondo dei computer, le API REST sono diventate più grandi e complesse e allo stesso tempo le persone volevano implementarle e consumarle in modo più veloce e più semplice. Questo è il motivo per cui Facebook ha avuto l'idea di GraphQL, e successivamente Open ha ottenuto. Il QL in GraphQL sta per il linguaggio delle query.

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

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

Richiesta: ottieni https: // API.github.com/utenti/
Risposta:

"Accedi": "Octocat",
"ID": 583231,
"node_id": "mdq6vxnlcju4mzizmq ==",
"Avatar_url": "https: // avatar3.githubusercontent.com/u/583231?v = 4 ",
"Gravatar_id": "",
"URL": "https: // API.github.com/utenti/octocat ",
"html_url": "https: // github.com/octocat ",
"seguaci_url": "https: // API.github.com/utenti/octocat/follower ",
"seguenti_url": "https: // API.github.com/utenti/octocat/segue /altro_user ",
"gists_url": "https: // API.github.com/utenti/octocat/gists /gist_id ",
"Starred_url": "https: // API.github.com/utenti/octocat/starred /proprietario /repo ",
"abbonamenti_url": "https: // API.github.com/utenti/octocat/abbonamenti ",
"Organizations_url": "https: // API.github.com/utenti/octocat/orgs ",
"Repos_url": "https: // API.github.com/utenti/octocat/repos ",
"Events_url": "https: // API.github.com/utenti/octocat/eventi /privacy ",
"Reced_events_url": "https: // API.github.com/utenti/octocat/ricevuti_events ",
"Digita": "Utente",
"site_admin": falso,
"Nome": "The OctoCat",
"Azienda": "Github",
"Blog": "http: // www.github.com/blog ",
"Posizione": "San Francisco",
"Email": NULL,
"Hirable": Null,
"Bio": null,
"public_repos": 8,
"public_gists": 8,
"follower": 2455,
"Seguendo": 9,
"Created_at": "2011-01-25t18: 44: 36z",
"Updated_at": "2018-11-22t16: 00: 23Z"

Ho usato il nome utente Oclocat, ma puoi sostituirlo con il nome utente di tua scelta e utilizzare Curl per effettuare questa richiesta nella linea di comando o nel postino se hai bisogno di una GUI. Mentre la richiesta era semplice, pensa a tutte le informazioni extra che stai ottenendo da questa risposta. Se dovessi elaborare i dati da un milione di tali utenti e filtrare tutti i dati non necessari utilizzando, ciò non è efficiente. Stai sprecando larghezza di banda, memoria e calco

Anche la struttura della risposta non è qualcosa che sai in anticipo. Questa risposta JSON è equivalente all'oggetto del dizionario in Python o un oggetto in JavaScript. Altri endpoint rispondono con oggetti JSON che possono essere composti da oggetti nidificati, elenco nidificato all'interno dell'oggetto o qualsiasi combinazione arbitraria di tipi di dati JSON e dovrai fare riferimento alla documentazione per ottenere i dettagli. Quando si elabora 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 ed Elimina per eseguire operazioni CRUD sul server. Invece, esiste un solo tipo di tipo di richiesta HTTP ed endopint per tutte le operazioni correlate al CRUD. In caso di github ciò comporta richieste di tipo di tipo con un solo endpoint https: // API.github.com/graphql

Essere una richiesta di post può portare con sé un corpo di testo come JSON attraverso il quale saranno le nostre operazioni grafiche. Queste operazioni possono essere di Typea Domanda 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 le chiamate API GraphQL è possibile utilizzare il graphql Explorer di GitHub. Dai un'occhiata a questo grafico Domanda per recuperare lo stesso tipo di dati (biografia pubblica di un utente) che abbiamo fatto sopra usando il riposo.

Richiesta: post https: // API.github.com/graphql
query
utente (login: "ranvo")
Bio


Risposta:

"dati":
"utente":
"Bio": "appassionati di tecnologia e scienze. Mi piacciono tutti i tipi di cose non correlate
Server alla fisica quantistica.\ r \ noccasionalmente, scrivo post sul blog sugli interessi di cui sopra."


Come puoi vedere, la risposta consiste solo in quello che hai chiesto, questa è la biografia dell'utente. Selezioni 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 di riposo tradizionale. Ricordiamo che tutte le richieste GraphQL sono fatte a un solo endpoint API. Prendi ad esempio il caso d'uso in cui è necessario chiedere al server API GitHub la bio dell'utente e una delle sue chiavi SSH. Richiederebbe due recensioni.

Richieste di riposo: Ottieni https: // API.github.com//
Ottieni https: // API.github.com//chiavi
Richiesta graphql: post https: // API.github.com/graphql/
query
utente (login: "ranvo")
Bio
PublicKeys (ultimo: 1)
bordi
nodo
chiave





Risposta graphql:

"dati":
"utente":
"Bio": "appassionati di tecnologia e scienze. Mi piacciono tutti i tipi di cose non correlate
Server alla fisica quantistica.\ r \ noccasionalmente, scrivo post sul blog sugli interessi di cui sopra.",
"PublicKeys":
"bordi": [

"nodo":
"Chiave": "SSH-ED25519 AAAAC3NZAC1LZDI1NTE5AAAAAIH31MVJRYDZEH8OD8JVAFPRUIGL65SWILYKPEGBUNGOT"


"



Ci sono oggetti nidificati, ma se guardi la tua richiesta, si abbinano praticamente alla tua richiesta in modo da poter sapere e, in un certo senso, modella la struttura della risposta che ottieni .

Conclusione

Graphql viene fornito con la sua curva di apprendimento, che è molto ripida o non ripida a seconda di chi si sta chiedendo. Dal punto di vista obiettivo, posso gettare i seguenti fatti per te. È flessibile come hai visto sopra, è introspettivo - vale a dire, è possibile interrogare l'API GraphQL sull'API stessa. Anche se non hai intenzione di costruire il tuo server API usandolo, è probabile che dovrai interfacciarsi con un'API che lo consente solo graphql.

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