Ich entwerfe eine API, die über HTTP läuft, und ich frage mich, ob die Verwendung des HTTP POST-Befehls, aber nur mit URL-Abfrageparametern und ohne Anfragebody, ein guter Weg ist, um zu gehen.
Erwägungen:
- "Gutes Webdesign" verlangt, dass nicht-idempotente Aktionen per POST gesendet werden. Dies ist eine nicht-idempotente Aktion.
- Es ist einfacher, diese Anwendung zu entwickeln und zu debuggen, wenn die Anfrageparameter in der URL enthalten sind.
- Die API ist nicht für eine breite Anwendung gedacht.
- Es scheint, dass eine POST-Anfrage ohne Body etwas mehr Arbeit erfordert, z.B. eine
Content-Length: 0
Kopfzeile muss explizit hinzugefügt werden. - Es scheint mir auch, dass ein POST ohne Body den Erwartungen der meisten Entwickler und HTTP-Frameworks widerspricht.
Gibt es weitere Fallstricke oder Vorteile bei der Übermittlung von Parametern bei einer POST-Anforderung über die URL-Abfrage und nicht über den Anforderungskörper?
Bearbeiten: Der Grund, warum dies in Erwägung gezogen wird, ist, dass die Operationen nicht idempotent sind und andere Nebeneffekte als das Abrufen haben. Siehe die HTTP-Spezifikation :
Insbesondere wurde die Konvention festgelegt, dass die Methoden GET und HEAD Methoden NICHT die Bedeutung haben sollen Bedeutung haben, eine andere Aktion als das Abrufen. Diese Methoden sollten als "sicher" angesehen werden. Dies erlaubt den Benutzer Agenten, andere Methoden darzustellen, wie POST, PUT und DELETE, in einer speziellen Art und Weise darzustellen, so dass dem Benutzer die darauf aufmerksam gemacht wird, dass eine möglicherweise unsichere Aktion angefordert wird.
...
Methoden können auch die Eigenschaft haben "Idempotenz" haben, indem sie (abgesehen von Fehler- oder Verfallsproblemen) die Nebeneffekte von N > 0 identischen Anfragen die gleichen sind wie bei einer einzigen Anfrage. Die Methoden GET, HEAD, PUT und DELETE haben diese Eigenschaft gemeinsam. Außerdem die Methoden OPTIONS und TRACE SHOULD KEINE Seiteneffekte haben und sind daher von Natur aus idempotent.
20 Stimmen
Warum sollte man POST überhaupt verwenden, wenn man im Textkörper keine Daten bereitstellt?
154 Stimmen
Denn der Vorgang ist nicht idempotent.
1 Stimmen
Was versuchen Sie zu tun, das nicht idempotent und keine echte POST ist? Es scheint, dass entweder Ihr REST-Design einige Probleme hat oder die Interaktion, die Sie zu schaffen versuchen, eignet sich nicht für eine RESTful-Schnittstelle. Vielleicht können wir Ihnen bei der Formulierung einer besseren REST-Schnittstelle helfen, wenn Sie mehr Details angeben.
23 Stimmen
@Jared, beachten Sie, dass das Wort "REST" in dieser Frage von vor 2,5 Jahren nicht vorkommt :) Die HTTP-Spezifikation über Idempotenz gilt unabhängig von der aktuellen Architektur für Webdienste. Glücklicherweise ist das System, für das diese API als Proxy konzipiert wurde, ohnehin obsolet geworden.
0 Stimmen
Ich frage mich nur, warum dies für "Leichtigkeit der Entwicklung und Fehlersuche", wenn es eine Tonne von Möglichkeiten, HTTP-Verkehr zu untersuchen (z. B. Webkit Inspector, Firebug ...)
8 Stimmen
Denn in den Serverprotokollen werden keine POST-Parameter aufgezeichnet, wohl aber die Abfragezeichenfolgen. Es ist viel einfacher, eine Reihe von Anfragen auszuführen, ohne sie im Browser zu instrumentieren, und sich dann den Traceback anzusehen, als sich durch sie durchzuklicken. Außerdem war die API nicht von Browser zu Server, sondern eher von Server zu Server. Vor allem aber wurde die ganze Angelegenheit sowieso in die Tonne getreten :)
0 Stimmen
Ok, ok, am Ende bist du nicht mitgegangen, aber im Ernst, was in aller Welt hast du da gemacht? Es fällt mir schwer, mir vorzustellen, wofür du diese Einrichtung verwenden würdest? War es im Grunde eine GET-Anfrage? Aber wo sich die Daten ändern können? Fast so, als ob Sie die Cache-Lebensdauer auf einen niedrigen Wert setzen würden, um dem Client mitzuteilen, dass die Daten nicht lange gültig sind und er sie erneut abrufen sollte, wenn er sie benötigt?
0 Stimmen
Wenn ich mich recht erinnere, ging es eher darum, die Beziehungen zwischen bestehenden Ressourcen zu manipulieren, als neue zu schaffen.
19 Stimmen
Für alle anderen, die nicht wissen, was "idempotent" bedeutet :| restapitutorial.com/lektionen/idempotency.html
2 Stimmen
Diese Frage wird im Rahmen der meta
0 Stimmen
Alle haben Recht: Bleiben Sie bei POST für nicht-idempotente Anfragen. Was ist mit der Verwendung eines URI-Abfrage-Strings und des Anforderungsinhalts? Nun, das ist gültiges HTTP (siehe Anmerkung 1), also warum nicht?! Es ist auch vollkommen logisch: URLs, einschließlich ihres Query-String-Teils, dienen zum Auffinden von Ressourcen. Die Verben der HTTP-Methode (POST - und der optionale Inhalt der Anfrage) dienen dazu, Aktionen zu spezifizieren, oder was mit den Ressourcen geschehen soll. Das sollten orthogonale Anliegen sein. (Aber sie sind nicht schön orthogonal für den speziellen Fall von ContentType=application/x-www-form-urlencoded, siehe Anmerkung 2 unten).
0 Stimmen
Ich würde denken, dass es immer noch ziemlich RESTful sein könnte, um Abfrageargumente zu haben, die die Ressource auf der URL identifizieren, während die Inhaltsnutzlast auf den POST-Body beschränkt bleibt. Dies scheint die Überlegungen "Was sende ich?" und "An wen sende ich es?" zu trennen.