Also habe ich einige Artikel zum Erstellen von REST-APIs durchgesehen. Und einige von ihnen schlagen vor, alle Arten von HTTP-Anforderungen zu verwenden: wie PUT
DELETE
POST
GET
. Wir würden zum Beispiel index.php erstellen und die API folgendermaßen schreiben:
$method = $_SERVER['REQUEST_METHOD'];
$request = split("/", substr(@$_SERVER['PATH_INFO'], 1));
switch ($method) {
case 'PUT':
....some put action....
break;
case 'POST':
....some post action....
break;
case 'GET':
....some get action....
break;
case 'DELETE':
....some delete action....
break;
}
OK, selbstverständlich - ich weiß (noch) nicht viel über Webdienste. Wäre es nicht einfacher, JSON- Objekte einfach über reguläres POST
oder GET
(das den Methodennamen und alle Parameter enthält) zu akzeptieren und dann auch in JSON zu antworten. Wir können einfach über PHPs serialisieren / deserialisieren json_encode()
und json_decode()
mit diesen Daten machen, was wir wollen, ohne mit verschiedenen HTTP-Anforderungsmethoden umgehen zu müssen.
Vermisse ich etwas
UPDATE 1:
Ok - nachdem ich verschiedene APIs durchgesehen und viel über XML-RPC , JSON-RPC , SOAP und REST gelernt hatte , kam ich zu dem Schluss, dass diese Art von API solide ist. Tatsächlich verwendet Stack Exchange diesen Ansatz auf ihren Websites ziemlich genau, und ich denke, dass diese Leute wissen, was sie mit Stack Exchange API tun .
Antworten:
Die Idee von RE Präsentations S tate T ransfer geht es nicht um Daten auf einfachste Weise möglich , den Zugriff.
Sie haben vorgeschlagen, Post-Anfragen für den Zugriff auf JSON zu verwenden. Dies ist eine absolut gültige Methode für den Zugriff auf / die Bearbeitung von Daten.
REST ist eine Methode für den sinnvollen Zugriff auf Daten. Wenn Sie eine Anfrage in REST sehen, sollte sofort klar sein, was mit den Daten passiert.
Beispielsweise:
wird wahrscheinlich eine Liste von Chevy-Autos zurückgeben.
Eine gute REST-API kann sogar einige Ausgabeoptionen in den Querystring einbinden, wie?output=json
oder?output=html
die es dem Accessor ermöglichen würden, zu entscheiden, in welchem Format die Informationen codiert werden sollen.Nach einem wenig darüber nachzudenken , wie man vernünftigerweise incorporate Typisierung in einen REST - API, habe ich festgestellt , dass der beste Weg , um die Art der Daten , über die bereits vorhandene Dateierweiterung würde explizit angeben, wie etwa
.js
,.json
,.html
, oder.xml
. Eine fehlende Dateierweiterung würde standardmäßig das Standardformat verwenden (z. B. JSON). Eine nicht unterstützte Dateierweiterung kann einen501 Not Implemented
Statuscode zurückgeben .Ein anderes Beispiel:
wird wahrscheinlich einen neuen Chevy Malibu in der Datenbank mit den dazugehörigen Farben erstellen. Ich sage wahrscheinlich, da die REST-API nicht direkt mit der Datenbankstruktur verknüpft sein muss. Es ist nur eine Maskierungsschnittstelle, damit die wahren Daten geschützt werden (denken Sie an Accessoren und Mutatoren für eine Datenbankstruktur).
Jetzt müssen wir uns dem Thema Idempotenz zuwenden . Normalerweise implementiert REST CRUD über HTTP. HTTP verwendet
GET
,PUT
,POST
undDELETE
für die Anforderungen.Eine sehr vereinfachte Implementierung von REST könnte das folgende CRUD-Mapping verwenden:
Bei dieser Implementierung gibt es ein Problem: Post ist als nicht idempotente Methode definiert. Dies bedeutet, dass nachfolgende Aufrufe derselben Post-Methode zu unterschiedlichen Serverzuständen führen. Get, Put und Delete sind idempotent. Dies bedeutet, dass ein mehrmaliger Aufruf zu einem identischen Serverstatus führen sollte.
Dies bedeutet, dass eine Anfrage wie:
könnte tatsächlich implementiert werden als:
Wohingegen
führt zu demselben Serverstatus, wenn Sie ihn einmal oder 1000 Mal aufrufen.
Eine bessere Möglichkeit, das Entfernen des
oldest
Artikels zu handhaben, besteht darin, Folgendes anzufordern:und verwenden Sie die
ID
aus den resultierenden Daten, um einedelete
Anfrage zu stellen:Ein Problem bei dieser Methode wäre, wenn
/cars
zwischen der/oldest
Anforderung und der Ausgabe ein weiteres Element hinzugefügt würdedelete
.quelle
POST: /cars/oldest
ein Ersatz für ein DELETE zu sein, macht nicht viel Sinn. So etwas wie -POST: /cars/oldest/delete
könnte, obwohl ich denke, dass mir Neils Lösung besser gefällt. Der einzige Vorteil, den ein direktes Löschen gegenüber seiner Lösung "get-id-delete-id" bietet, ist die Atomizität. Ich möchte eine klare geschäftliche Rechtfertigung mit einem nicht erfundenen Szenario, bevor ich so etwas implementiere. Sie müssen nicht alle Verben für alle Objekte / URLs unterstützen.Dies ist eine Sicherheits- und Wartbarkeitsfrage.
sichere Methoden
Wann immer möglich, sollten Sie "sichere" (unidirektionale) Methoden wie GET und HEAD verwenden, um potenzielle Sicherheitslücken zu begrenzen.
idempotente Methoden
Wann immer möglich, sollten Sie "idempotente" Methoden wie GET, HEAD, PUT und DELETE verwenden, die keine Nebenwirkungen haben können und daher weniger fehleranfällig / leichter zu kontrollieren sind.
Quelle
quelle
Kurz gesagt, REST betont Substantive gegenüber Verben. Wenn Ihre API komplexer wird, fügen Sie mehr Dinge hinzu als mehr Befehle.
quelle
Sie haben gefragt :
Aus der Wikipedia auf REST :
Nach dem, was ich (wenig) gesehen habe, glaube ich, dass dies normalerweise erreicht wird, indem die Verwendung vorhandener HTTP-Verben maximiert und ein URL-Schema für Ihren Dienst entworfen wird, das so leistungsfähig und selbstverständlich wie möglich ist.
Benutzerdefinierte Datenprotokolle (auch wenn sie auf Standardprotokollen wie SOAP oder JSON aufbauen) werden nicht empfohlen und sollten minimiert werden, um der REST-Ideologie am besten zu entsprechen.
Die tatsächlichen Objekte, mit denen Sie arbeiten, können in einem beliebigen Format vorliegen. Die Idee ist, so viel HTTP wie möglich wiederzuverwenden, um Ihre Vorgänge verfügbar zu machen, die der Benutzer für diese Ressource ausführen möchte (Abfragen, Statusverwaltung / Mutation, Löschen).
Sie haben gefragt :
Über REST und die URI-Syntax / HTTP-Verben selbst gibt es noch viel mehr zu wissen. Zum Beispiel sind einige der Verben idempotent, andere nicht. Ich habe in Ihrer Frage nichts darüber gesehen, also habe ich nicht versucht, mich darauf einzulassen. Die anderen Antworten und Wikipedia haben beide viele gute Informationen.
Außerdem gibt es viel zu lernen über die verschiedenen Netzwerktechnologien, die auf HTTP basieren und die Sie nutzen können, wenn Sie eine wirklich erholsame API verwenden. Ich würde mit der Authentifizierung beginnen.
quelle
In Bezug auf die Verwendung der Erweiterung zum Definieren des Datentyps. Ich habe festgestellt, dass die MailChimp-API dies tut, halte dies jedoch nicht für eine gute Idee.
Mein Sound scheint eine gute Idee zu sein, aber ich denke, ein "älterer" Ansatz ist besser - die Verwendung von HTTP-Headern
Auch HTTP-Header sind viel besser für die datenübergreifende Kommunikation (falls jemals jemand sie benötigen würde)
quelle
Ja. ;-);
Dieses Phänomen besteht aufgrund der einheitlichen Schnittstellenbeschränkung . REST verwendet bereits vorhandene Standards, anstatt das Rad neu zu erfinden. Der HTTP-Standard hat sich bereits als hoch skalierbar erwiesen (das Web funktioniert eine Weile). Warum sollten wir etwas reparieren, das nicht kaputt ist?!
Hinweis: Die einheitliche Schnittstellenbeschränkung ist wichtig, wenn Sie die Clients vom Dienst entkoppeln möchten. Es ähnelt dem Definieren von Schnittstellen für Klassen, um sie voneinander zu entkoppeln. Ofc. Hier besteht die einheitliche Schnittstelle aus Standards wie HTTP , MIME-Typen , URI , RDF , Vokabeln für verknüpfte Daten , Hydra- Vokabeln usw.
quelle
Gute Semantik ist wichtig für die Programmierung.
Die Verwendung weiterer Methoden neben GET / POST ist hilfreich, da dies die Lesbarkeit Ihres Codes verbessert und die Wartung erleichtert.
Warum?
Weil Sie wissen, dass GET Daten von Ihrer API abruft. Sie wissen, dass POST Ihrem System neue Daten hinzufügt. Sie wissen, dass PUT Aktualisierungen vornehmen wird. DELETE löscht Zeilen usw. usw.
Normalerweise strukturiere ich meine RESTFUL-Webdienste so, dass ich einen Funktionsrückruf habe, der den gleichen Namen wie die Methode hat.
Ich benutze PHP, also benutze ich function_exists (ich denke es heißt). Wenn die Funktion nicht existiert, werfe ich eine 405 (METHODE NICHT ERLAUBT).
quelle
Bill Venners: In Ihrem Blog-Beitrag mit dem Titel "Warum REST fehlgeschlagen ist" sagten Sie, dass wir alle vier HTTP-Verben benötigen - GET, POST, PUT und DELETE - und beklagten, dass Browser-Anbieter nur GET und POST benötigen. "Warum brauchen wir alle vier? Verben? Warum reichen GET und POST nicht aus?
Elliotte Rusty Harold: In HTTP gibt es vier grundlegende Methoden: GET, POST, PUT und DELETE. GET wird die meiste Zeit verwendet. Es wird für alles verwendet, was sicher ist und keine Nebenwirkungen verursacht. GET kann mit einem Lesezeichen versehen, zwischengespeichert, verknüpft und über einen Proxyserver übertragen werden. Es ist eine sehr mächtige Operation, eine sehr nützliche Operation.
Im Gegensatz dazu ist POST vielleicht die leistungsstärkste Operation. Es kann alles machen. Es gibt keine Grenzen, was passieren kann, und deshalb muss man sehr vorsichtig damit sein. Sie setzen kein Lesezeichen. Sie zwischenspeichern es nicht. Sie holen es nicht vor. Mit einem POST machen Sie nichts, ohne den Benutzer zu fragen. Willst du das machen Wenn der Benutzer die Taste drückt, können Sie Inhalte veröffentlichen. Sie werden jedoch nicht alle Schaltflächen auf einer Seite anzeigen und sie nach dem Zufallsprinzip drücken. Im Gegensatz dazu können Browser alle Links auf der Seite anzeigen und vorab abrufen oder diejenigen vorab abrufen, von denen sie glauben, dass sie am wahrscheinlichsten als Nächstes befolgt werden. Tatsächlich haben einige Browser, Firefox-Erweiterungen und verschiedene andere Tools versucht, dies zu dem einen oder anderen Zeitpunkt zu tun.
PUT und DELETE befinden sich in der Mitte zwischen GET und POST. Der Unterschied zwischen PUT oder DELETE und POST besteht darin, dass PUT und DELETE * idempotent sind, während POST dies nicht ist. PUT und DELETE können bei Bedarf wiederholt werden. Angenommen, Sie versuchen, eine neue Seite auf eine Site hochzuladen. Angenommen, Sie möchten eine neue Seite unter erstellen http://www.example.com/foo.htmlGeben Sie also Ihren Inhalt ein und fügen Sie ihn unter dieser URL ein. Der Server erstellt diese Seite unter der von Ihnen angegebenen URL. Nehmen wir nun an, Ihre Netzwerkverbindung wird aus irgendeinem Grund unterbrochen. Sie sind sich nicht sicher, ob die Anfrage durchgekommen ist oder nicht? Vielleicht ist das Netzwerk langsam. Möglicherweise gab es ein Proxy-Server-Problem. Es ist also vollkommen in Ordnung, es noch einmal oder noch einmal zu versuchen - so oft Sie möchten. Weil das zehnmalige Einfügen desselben Dokuments in dieselbe URL nicht anders ist als das einmalige Einfügen. Gleiches gilt für DELETE. Sie können etwas zehnmal LÖSCHEN, und das entspricht dem einmaligen Löschen.
Im Gegensatz dazu kann POST dazu führen, dass jedes Mal etwas anderes passiert. Stellen Sie sich vor, Sie verlassen einen Online-Shop, indem Sie auf die Schaltfläche "Kaufen" klicken. Wenn Sie diese POST-Anfrage erneut senden, können Sie möglicherweise ein zweites Mal alles in Ihrem Warenkorb kaufen. Wenn Sie es erneut senden, haben Sie es ein drittes Mal gekauft. Aus diesem Grund müssen Browser sehr vorsichtig sein, wenn sie POST-Vorgänge ohne ausdrückliche Zustimmung des Benutzers wiederholen, da POST zwei Dinge verursachen kann, wenn Sie es zweimal tun, drei Dinge, wenn Sie es dreimal tun. Bei PUT und DELETE gibt es einen großen Unterschied zwischen null und eins, aber keinen Unterschied zwischen einer und zehn.
Bitte besuchen Sie die URL für weitere Details. http://www.artima.com/lejava/articles/why_put_and_delete.html
Aktualisieren:
Idempotente Methoden Eine idempotente HTTP-Methode ist eine HTTP-Methode, die ohne unterschiedliche Ergebnisse mehrmals aufgerufen werden kann. Es spielt keine Rolle, ob die Methode nur einmal oder zehnmal aufgerufen wird. Das Ergebnis sollte das gleiche sein. Dies gilt wiederum nur für das Ergebnis, nicht für die Ressource selbst. Dies kann weiterhin manipuliert werden (wie ein Aktualisierungszeitstempel, vorausgesetzt, diese Informationen werden nicht in der (aktuellen) Ressourcendarstellung geteilt.
Betrachten Sie die folgenden Beispiele:
Das erste Beispiel ist idempotent: Egal wie oft wir diese Anweisung ausführen, a wird immer 4 sein. Das zweite Beispiel ist nicht idempotent. Das 10-fache Ausführen führt zu einem anderen Ergebnis als das 5-fache Ausführen. Da beide Beispiele den Wert von a ändern, sind beide nicht sichere Methoden.
quelle
Grundsätzlich ist REST ( Wiki ):
REST ist kein Protokoll, es sind Prinzipien. Verschiedene Uris und Methoden - jemand, der als Best Practices bezeichnet wird.
quelle