REST-API

REST-API im Vergleich zu GraphQL

REST-API im Vergleich zu GraphQL

TL;DR-Version

In einem der vorherigen Beiträge haben wir kurz besprochen, wie es ist, die GitHub-API v3 zu verwenden. Diese Version ist so konzipiert, dass sie wie jede andere REST-API angebunden werden kann. Es gibt Endpunkte für jede Ressource, auf die Sie zugreifen und/oder die Sie ändern müssen. Es gibt Endpunkte für jeden Benutzer, jede Organisation, jedes Repository usw. Beispielsweise hat jeder Benutzer seinen API-Endpunkt unter https://api.github.com/Benutzer/ Sie können versuchen, Ihren Benutzernamen anstelle von zu ersetzen und geben Sie die URL in einen Browser ein, um zu sehen, womit die API antwortet.

GitHub API v4 hingegen verwendet GraphQL, wobei QL für Query Language steht. GraphQL ist eine neue Art, Ihre APIs zu entwerfen. So wie viele Webdienste als REST-APIs angeboten werden, nicht nur die von GitHub, gibt es viele Webdienste, mit denen Sie über GraphQL darauf zugreifen können.

Der gravierendste Unterschied zwischen GraphQL und REST API besteht darin, dass GraphQL von einem einzigen API-Endpunkt aus arbeiten kann. Im Fall von GitHub API v4 ist dieser Endpunkt https://api.github.com/graphql und das war's. Sie müssen sich nicht darum kümmern, lange Zeichenfolgen am Ende eines Root-URIs anzuhängen oder einen Abfragezeichenfolgenparameter für zusätzliche Informationen anzugeben. Sie senden einfach ein JSON-ähnliches Argument an diese API und fragen nur nach den Dingen, die Sie benötigen, und Sie erhalten eine JSON-Nutzlast mit genau denselben Informationen zurück, die Sie angefordert haben. Sie müssen sich nicht darum kümmern, unerwünschte Informationen herauszufiltern, oder leiden unter Performance-Overhead aufgrund großer Antworten.

Was ist REST-API??

Nun, REST steht für Representational State Transfer und API steht für Application Programming Interface. Eine REST-API oder "RESTful"-API ist zur zentralen Designphilosophie der meisten modernen Client-Server-Anwendungen geworden. Die Idee ergibt sich aus der Notwendigkeit, verschiedene Komponenten einer Anwendung wie die clientseitige Benutzeroberfläche und die serverseitige Logik zu trennen.

Daher ist die Sitzung zwischen einem Client und einem Server normalerweise zustandslos. Sobald die Webseite und die zugehörigen Skripte geladen sind, können Sie weiterhin mit ihnen interagieren und wenn Sie eine Aktion ausführen (z. B. eine Sendetaste drücken), wird eine Sendeanforderung zusammen mit allen Kontextinformationen gesendet, die der Webserver zur Verarbeitung dieser Anforderung benötigt ( wie Benutzername, Token usw.). Die Anwendung wechselt von einem Zustand in einen anderen, ohne dass eine ständige Verbindung zwischen Client und Server erforderlich ist.

REST definiert eine Reihe von Einschränkungen zwischen dem Client und dem Server, und die Kommunikation kann nur unter diesen Einschränkungen erfolgen. Zum Beispiel verwendet REST über HTTP normalerweise das CRUD-Modell, das für Create, Read, Update und Delete steht, und HTTP-Methoden wie POST, GET, PUT und DELETE helfen Ihnen, diese Operationen und diese Operationen allein auszuführen. Alte Intrusionstechniken wie SQL-Injections sind mit so etwas wie einer straff geschriebenen REST-API nicht möglich (obwohl REST kein Allheilmittel für die Sicherheit ist).

Es hilft auch UI-Entwicklern sehr! Da alles, was Sie von einer HTTP-Anfrage erhalten, ein typischer Textstrom ist (manchmal als JSON formatiert), können Sie problemlos eine Webseite für Browser oder eine App (in Ihrer bevorzugten Sprache) implementieren, ohne sich um die serverseitige Architektur kümmern zu müssen. Sie lesen die API-Dokumentation für Dienste wie Reddit, Twitter oder Facebook und können Erweiterungen für diese oder Drittanbieter-Clients in der Sprache Ihrer Wahl schreiben, da Sie garantiert sind, dass das Verhalten der API immer gleich bleibt.

Umgekehrt ist es dem Server egal, ob das Frontend in Go, Ruby oder Python geschrieben ist. Ob Browser, App oder CLI. Es „sieht“ nur die Anfrage und antwortet entsprechend.

Was ist GraphQL??

Wie bei allem in der Welt der Computer wurden REST-APIs größer und komplexer und gleichzeitig wollten die Leute sie schneller und einfacher implementieren und nutzen. Aus diesem Grund hat Facebook die Idee von GraphQL entwickelt und später als Open Source veröffentlicht. Die QL in GraphQL steht für Query Language.

GraphQL ermöglicht es Clients, sehr spezifische API-Anfragen zu stellen, anstatt starre API-Aufrufe mit vordefinierten Parametern und Antworten durchzuführen making. Es ist viel einfacher, weil der Server dann mit genau den Daten antwortet, nach denen Sie ihn gefragt haben, ohne Übermaß.

Sehen Sie sich diese REST-Anfrage und die entsprechende Antwort an. Diese Anfrage soll nur die öffentliche Biografie eines Benutzers anzeigen.

Anfrage: GET https://api.github.com/Benutzer/
Antwort:

"login": "Oktokatze",
"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/users/octocat/subscriptions",
"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",
"typ": "Benutzer",
"site_admin": falsch,
"name": "Der Oktokat",
"unternehmen": "GitHub",
"blog": "http://www.github.de/blog",
"Standort": "San Francisco",
"E-Mail": null,
"mietbar": null,
"bio": null,
"public_repos": 8,
"public_gists": 8,
"Anhänger": 2455,
"folgend": 9,
"created_at": "2011-01-25T18:44:36Z",
"updated_at": "2018-11-22T16:00:23Z"

Ich habe den Nutzernamen octocat verwendet, aber Sie können ihn durch den Nutzernamen Ihrer Wahl ersetzen und mit cURL diese Anfrage in der Befehlszeile oder Postman stellen, wenn Sie eine GUI benötigen. Obwohl die Anfrage einfach war, denken Sie an all die zusätzlichen Informationen, die Sie aus dieser Antwort erhalten. Wenn Sie Daten von einer Million solcher Benutzer verarbeiten und alle unnötigen Daten herausfiltern, dann ist das nicht effizient. Sie verschwenden Bandbreite, Arbeitsspeicher und Rechenleistung, um all die Millionen zusätzlichen Schlüssel-Wert-Paare zu erhalten, zu speichern und zu filtern, die Sie nie bekommen werden

Auch die Struktur der Antwort ist nichts, was Sie vorher wissen. Diese JSON-Antwort entspricht einem Dictionary-Objekt in Python oder einem Objekt in JavaScript. Andere Endpunkte antworten mit JSON-Objekten, die aus verschachtelten Objekten, einer verschachtelten Liste innerhalb des Objekts oder einer beliebigen Kombination von JSON-Datentypen bestehen können, und Sie müssen die Dokumentation lesen, um die Einzelheiten zu erfahren. Wenn Sie die Anfrage verarbeiten, müssen Sie sich dieses Formats bewusst sein, das sich von Endpunkt zu Endpunkt ändert.

GraphQL verlässt sich nicht auf HTTP-Verben wie POST, GET, PUT und DELETE, um CRUD-Operationen auf dem Server auszuführen. Stattdessen gibt es für alle CRUD-bezogenen Operationen nur einen Typ von HTTP-Anforderungstyp und Endopint. Im Fall von GitHub handelt es sich um Anfragen vom Typ POST mit nur einem Endpunkt https://api.github.com/graphql

Da es sich um eine POST-Anfrage handelt, kann sie einen JSON-ähnlichen Textkörper mit sich führen, durch den unsere GraphQL-Operationen erfolgen. Diese Operationen können von der Art sein Abfrage wenn es nur ein paar Informationen lesen möchte, oder es kann ein Mutation falls Daten geändert werden müssen.

Um GraphQL-API-Aufrufe zu tätigen, können Sie den GraphQL-Explorer von GitHub verwenden. Schauen Sie sich diesen GraphQL an Abfrage um die gleiche Art von Daten (die öffentliche Biografie eines Benutzers) wie oben mit REST . abzurufen.

Anfrage: POST https://api.github.com/graphql
Abfrage
Benutzer (Login: "ranvo")
bio


 
Antwort:
 

"Daten":
"Benutzer":
"bio": "Technik- und Wissenschaftsbegeisterte. Ich stehe auf alle möglichen nicht verwandten Sachen von
Server zur Quantenphysik.\r\nGelegentlich schreibe ich Blogbeiträge zu den oben genannten Interessen."


Wie Sie sehen können, besteht die Antwort nur aus dem, wonach Sie gefragt haben, das ist die Biografie des Benutzers. Sie wählen einen bestimmten Benutzer aus, indem Sie den Benutzernamen übergeben (in meinem Fall ist es ranvo) und dann fragen Sie nach dem Wert eines Attributs dieses Benutzers, in diesem Fall ist dieses Attribut bio. Der API-Server sucht die genauen spezifischen Informationen und antwortet damit und sonst nichts.

Auf der anderen Seite können Sie mit GraphQL auch eine einzelne Anfrage stellen und Informationen extrahieren, für die Sie in der herkömmlichen REST-API mehrere Anfragen benötigt hätten. Denken Sie daran, dass alle GraphQL-Anfragen nur an einen API-Endpunkt gesendet werden. Nehmen Sie zum Beispiel den Anwendungsfall, bei dem Sie den GitHub-API-Server nach der Biografie des Benutzers und einem seiner SSH-Schlüssel fragen müssen. Es würde zwei GET-Anfragen erfordern.

REST-Anfragen: GET https://api.github.com//
Holen Sie sich https://api.github.com//Schlüssel
 
GraphQL-Anfrage: POST https://api.github.com/graphql/
 
Abfrage
Benutzer (Login: "ranvo")
bio
publicKeys (letzter:1)
Kanten
Knoten
Schlüssel





 
GraphQL-Antwort:
 

"Daten":
"Benutzer":
"bio": "Technik- und Wissenschaftsbegeisterte. Ich stehe auf alle möglichen nicht verwandten Sachen von
Server zur Quantenphysik.\r\nGelegentlich schreibe ich Blogbeiträge zu den oben genannten Interessen.",
"publicKeys":
"Kanten": [

"Knoten":
"key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH31mVjRYdzeh8oD8jvaFpRuIgL65SwILyKpeGBUNGOT"


]



Es gibt verschachtelte Objekte, aber wenn Sie sich Ihre Anfrage ansehen, stimmen sie ziemlich genau mit Ihrer Anfrage überein, sodass Sie die Struktur der Antwort, die Sie erhalten, kennen und in gewisser Weise formen können .

Fazit

GraphQL hat eine eigene Lernkurve, die sehr steil oder gar nicht steil ist, je nachdem, wen Sie fragen. Aus objektiver Sicht kann ich folgende Fakten für Sie festhalten. Es ist flexibel, wie Sie oben gesehen haben, es ist introspektiv - das heißt, Sie können die GraphQL-API über die API selbst abfragen. Selbst wenn Sie Ihren API-Server nicht damit erstellen, müssen Sie wahrscheinlich eine Schnittstelle zu einer API verwenden, die nur GraphQL zulässt.

Sie können hier ein wenig mehr über die technischen Details erfahren. Wenn Sie GraphQL-API-Aufrufe von Ihrer lokalen Workstation aus durchführen möchten, verwenden Sie Graphiql.

So ändern Sie Mauszeiger- und Cursorgröße, Farbe und Schema unter Windows 10
Der Mauszeiger und der Cursor in Windows 10 sind sehr wichtige Aspekte des Betriebssystems. Dies kann auch für andere Betriebssysteme gesagt werden, a...
Kostenlose und Open-Source-Spiele-Engines für die Entwicklung von Linux-Spielen
Dieser Artikel behandelt eine Liste von kostenlosen und Open-Source-Spiele-Engines, die für die Entwicklung von 2D- und 3D-Spielen unter Linux verwend...
Shadow of the Tomb Raider für Linux Tutorial
Shadow of the Tomb Raider ist die zwölfte Erweiterung der Tomb Raider-Reihe – ein Action-Adventure-Franchise von Eidos Montrealdos. Das Spiel wurde vo...