REST ist das grundlegende architektonische Prinzip des Webs. Das Erstaunliche am Web ist die Tatsache, dass Clients (Browser) und Server auf komplexe Weise interagieren können, ohne dass der Client im Voraus etwas über den Server und die von ihm gehosteten Ressourcen weiß. Die wichtigste Voraussetzung dafür ist, dass Server und Client sich über die Medien verwendet, die im Falle des Webs HTML .
Eine API, die sich an die Grundsätze der REST setzt nicht voraus, dass der Client etwas über die Struktur der API weiß. Vielmehr muss der Server alle Informationen bereitstellen, die der Client benötigt, um mit dem Dienst zu interagieren. Eine HTML-Formular ist ein Beispiel dafür: Der Server gibt den Speicherort der Ressource und die erforderlichen Felder an. Der Browser weiß nicht im Voraus, wohin er die Informationen übermitteln soll, und er weiß nicht im Voraus, welche Informationen er übermitteln soll. Beide Arten von Informationen werden vollständig vom Server bereitgestellt. (Dieses Prinzip wird als HATEOAS : Hypermedia als Motor des Anwendungsstatus .)
Was bedeutet das nun für HTTP und wie kann sie in der Praxis umgesetzt werden? HTTP ist auf Verben und Ressourcen ausgerichtet. Die beiden gebräuchlichsten Verben sind GET
y POST
die, wie ich glaube, jeder erkennen wird. Der HTTP-Standard definiert jedoch einige andere, wie z. B. PUT
y DELETE
. Diese Verben werden dann gemäß den Anweisungen des Servers auf die Ressourcen angewendet.
Nehmen wir zum Beispiel an, dass wir eine Benutzerdatenbank haben, die von einem Webdienst verwaltet wird. Unser Dienst verwendet eine benutzerdefinierte Hypermedia auf der Grundlage von JSON, für die wir den Mimetyp application/json+userdb
(Möglicherweise gibt es auch eine application/xml+userdb
y application/whatever+userdb
- viele Medientypen können unterstützt werden). Sowohl der Client als auch der Server wurden so programmiert, dass sie dieses Format verstehen, aber sie wissen nichts voneinander. Als Roy Fielding weist darauf hin:
Eine REST-API sollte fast ihren gesamten Beschreibungsaufwand in Definition des Medientyps/der Medientypen, der/die zur Darstellung von Ressourcen und zur Steuerung des Anwendungsstatus verwendet werden, oder in der Definition von erweiterten Beziehungsnamen und/oder hypertextfähigen Markups für bestehende Standardmedientypen.
Eine Anfrage für die Basisressource /
könnte etwa so aussehen:
Anfrage
GET /
Accept: application/json+userdb
Antwort
200 OK
Content-Type: application/json+userdb
{
"version": "1.0",
"links": [
{
"href": "/user",
"rel": "list",
"method": "GET"
},
{
"href": "/user",
"rel": "create",
"method": "POST"
}
]
}
Aus der Beschreibung unserer Medien wissen wir, dass wir Informationen über verwandte Ressourcen in Abschnitten mit der Bezeichnung "Links" finden können. Dies wird als Hypermedia-Kontrollen . In diesem Fall können wir aus einem solchen Abschnitt erkennen, dass wir eine Benutzerliste finden können, indem wir eine weitere Anfrage für /user
:
Anfrage
GET /user
Accept: application/json+userdb
Antwort
200 OK
Content-Type: application/json+userdb
{
"users": [
{
"id": 1,
"name": "Emil",
"country: "Sweden",
"links": [
{
"href": "/user/1",
"rel": "self",
"method": "GET"
},
{
"href": "/user/1",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/1",
"rel": "delete",
"method": "DELETE"
}
]
},
{
"id": 2,
"name": "Adam",
"country: "Scotland",
"links": [
{
"href": "/user/2",
"rel": "self",
"method": "GET"
},
{
"href": "/user/2",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/2",
"rel": "delete",
"method": "DELETE"
}
]
}
],
"links": [
{
"href": "/user",
"rel": "create",
"method": "POST"
}
]
}
Aus dieser Antwort können wir viel ablesen. Zum Beispiel wissen wir jetzt, dass wir einen neuen Benutzer erstellen können, indem wir POST
in Bezug auf /user
:
Anfrage
POST /user
Accept: application/json+userdb
Content-Type: application/json+userdb
{
"name": "Karl",
"country": "Austria"
}
Antwort
201 Created
Content-Type: application/json+userdb
{
"user": {
"id": 3,
"name": "Karl",
"country": "Austria",
"links": [
{
"href": "/user/3",
"rel": "self",
"method": "GET"
},
{
"href": "/user/3",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/3",
"rel": "delete",
"method": "DELETE"
}
]
},
"links": {
"href": "/user",
"rel": "list",
"method": "GET"
}
}
Wir wissen auch, dass wir vorhandene Daten ändern können:
Anfrage
PUT /user/1
Accept: application/json+userdb
Content-Type: application/json+userdb
{
"name": "Emil",
"country": "Bhutan"
}
Antwort
200 OK
Content-Type: application/json+userdb
{
"user": {
"id": 1,
"name": "Emil",
"country": "Bhutan",
"links": [
{
"href": "/user/1",
"rel": "self",
"method": "GET"
},
{
"href": "/user/1",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/1",
"rel": "delete",
"method": "DELETE"
}
]
},
"links": {
"href": "/user",
"rel": "list",
"method": "GET"
}
}
Beachten Sie, dass wir verschiedene HTTP-Verben verwenden ( GET
, PUT
, POST
, DELETE
usw.), um diese Ressourcen zu manipulieren, und dass das einzige Wissen, das wir auf Seiten des Kunden voraussetzen, unsere Mediendefinition ist.
Lesen Sie weiter:
(An dieser Antwort wurde viel Kritik geübt, weil sie den Kern der Sache nicht trifft. Im Großen und Ganzen ist das eine berechtigte Kritik. Was ich ursprünglich beschrieben habe, entsprach eher der Art und Weise, wie REST vor ein paar Jahren, als ich dies zum ersten Mal schrieb, üblicherweise implementiert wurde, als seiner wahren Bedeutung. Ich habe die Antwort überarbeitet, um die wahre Bedeutung besser darzustellen).
3 Stimmen
Siehe auch die Antwort unter dem folgenden Link stackoverflow.com/a/37683965/3762855
4 Stimmen
REST ist vielleicht ein bisschen alt geworden ;) youtu.be/WQLzZf34FJ8
1 Stimmen
Weitere Informationen finden Sie unter folgendem Link news.ycombinator.com/item?id=3538585
0 Stimmen
Berichtigungen der akzeptierten Antwort hier. stackoverflow.com/questions/19843480/ Oder hier roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven Oder hier web.archive.org/web/20130116005443/http://tomayko.com/writings/
0 Stimmen
Ich möchte nur einen Satz hinzufügen, von dem ich wirklich glaube, dass er viel Bedeutung hat: "Bei REST geht es darum, die Art und Weise, wie das menschliche Web funktioniert, auf das programmatische WEB anzuwenden."
0 Stimmen
RESTful Programmierung (rpc Rahmen) ist eine beliebte, aber nicht beste rpc Rahmen. Http POST und json rpc framework ist besser als REST rpc framework. Welche Methode sollte ich verwenden, wenn ich eine Login-Api hinzufügen möchte? GET?POST? Sollte ich json im POST-Body verwenden oder sollte ich http-Abfrage im POST-Body verwenden? Wie parse ich einen REST-Antwortkörper? Wird der Server json verwenden? Verwendet der Server eine http-Abfrage? REST macht die Dinge nur komplex und nicht konsistent. Ich kann nur POST und json verwenden, um zu tun, was ich will. Ich möchte nicht über GET/POST/DELETE Zeug kümmern.
0 Stimmen
Mark Knol, die Verwendung von Humor oder anderen menschlichen Verhaltensweisen (wie z.B. "Danke" sagen) ist von den Moderatoren, die einen Demutseinlauf erlebt haben, strengstens untersagt.
0 Stimmen
Diese Frage entspricht nicht den Richtlinien von StackOverflow. Sie kann mit einer einfachen Suche beantwortet werden: de.wikipedia.org/wiki/Repräsentative_Zustandsübertragung
9 Stimmen
@OLIVER.KOO Gute Beobachtung. Es ist nur so, dass ich die Frage zu einer Zeit gestellt habe, als das Thema noch recht neu war. Es wurde viel darüber geredet, aber nicht viele Leute wussten, worum es ging. Zumindest wusste ich es nicht, und es scheint, dass meine Frage ihnen geholfen hat, weil sie es auch wissen wollten.