Frage

Ich bin der Gestaltung eines API HTTP zu gehen und ich frage mich, ob die HTTP-POST-Befehl, aber mit URL-Abfrageparameter nur und keine Anfrage Körper, ist ein guter Weg zu gehen.

Überlegungen:

  • "Good Web Design" erfordert nicht idempotent Aktionen via POST gesendet werden soll. Dies ist eine Nicht-idempotent Aktion.
  • Es ist einfacher, diese App zu entwickeln und zu debuggen, wenn die Anfrage Parameter in der URL vorhanden sind.
  • Die API ist nicht für die weit verbreiteten Gebrauch bestimmt.
  • Es scheint eine POST-Anfrage ohne Körper wie die Herstellung wird ein bisschen mehr Arbeit übernehmen, zum Beispiel ein Content-Length: 0 Header explizit hinzugefügt werden müssen.
  • Es scheint mir auch, dass ein POST ohne Körper die meisten Entwickler und HTTP-Frameworks die Erwartungen ein Bit-Zähler ist.

Gibt es mehr Fallen oder Vorteile Parameter auf einer POST-Anforderung über die URL-Abfrage statt der Anfrage Körper sendet?

Edit: Der Grund, dies in Betracht gezogen wird, ist, dass die Operationen nicht sind idempotent und Nebenwirkungen außer Retrieval haben. Siehe der HTTP-Spezifikation :

  

Insbesondere hat die Konvention gewesen   festgestellt, dass die GET und HEAD   Methoden haben, sollten Sie nicht die   Bedeutung eine andere Aktion unter   als Retrieval. Diese Verfahren sollten   werden als „sicher“. Dies ermöglicht dem Benutzer,   Mittel, andere Verfahren zu repräsentieren,   wie POST, PUT und DELETE, in einem   besondere Art und Weise, so dass der Benutzer gemacht   sich der Tatsache bewusst, dass eine möglicherweise   unsichere Aktion angefordert wird.

     

...

     

Methoden können auch die Eigenschaft besitzen,   „Idempotenz“ in die (abgesehen von   Fehler oder Ablauffragen) die   Nebenwirkungen von N> 0 identischen   Anfragen ist die gleiche wie für eine einzelne   Anfrage. Die Methoden GET, HEAD, PUT   und löschen Sie diese Eigenschaft teilen. Ebenfalls,   Die Methoden OPTIONS und TRACE SOLL   haben keine Nebenwirkungen, und so sind   von Natur aus idempotent.

War es hilfreich?

Lösung

Wenn die Aktion nicht idempotent, dann Sie muss Verwendung POST. Wenn Sie dies nicht tun, sind Sie nur Ärger auf der ganzen Linie. GET, PUT und DELETE Methoden sind erforderlich idempotent werden. Stellen Sie sich vor, was in Ihrer Anwendung passieren würde, wenn der Client wurde jede mögliche GET Anfrage für Ihren Service Prefetching -. Wenn diese Nebenwirkungen sichtbar für den Kunden verursachen würde, dann etwas falsch ist

Ich bin damit einverstanden, dass eine POST mit einem Query-String zu senden, aber ohne einen Körper scheint seltsam, aber ich denke, es kann in manchen Situationen sinnvoll sein.

Denken Sie an die Abfrage Teil einer URL als Befehl an die Ressource den Umfang der aktuellen Anforderung zu begrenzen. Typischerweise werden Query-Strings eine GET Anfrage zu sortieren oder filtern (wie ?page=1&sort=title), aber ich nehme an, es Sinn auf einem POST macht auch den Umfang zu begrenzen (vielleicht wie ?action=delete&id=5).

Andere Tipps

Jeder hat Recht: Stick mit POST für Nicht-idempotent Anfragen

.

Was ist sowohl eine URI Query-String und Anforderungs-Inhalt unter Verwendung? Nun, es ist gültig HTTP (siehe Anmerkung 1), also warum nicht!

Es ist auch völlig logisch: URLs, einschließlich ihrem Query-String-Teil ist für Ortungs Ressourcen. Während HTTP-Methode Verben (POST - und sein optionale Anfrage Inhalt) sind für die Angabe Aktionen oder , was zu tun Ressourcen. Diese sollten orthogonal Anliegen sein. (Aber, sind sie nicht schön orthogonal Bedenken für den speziellen Fall von Content = application / x-www-form-urlencoded siehe 2 Anmerkung unten).

Anmerkung 1: HTTP-Spezifikation (1.1) nicht an, dass Abfrageparameter und Inhalt sich gegenseitig aus für einen HTTP-Server, der POST akzeptiert oder Anfragen PUT. So dass jeder Server ist frei sowohl zu akzeptieren. D. h Wenn Sie den Server dort schreiben ist nichts zu stoppen Sie beide (außer vielleicht ein unflexibles Gerüst) zu übernehmen wählen. Im Allgemeinen kann der Server Query-Strings nach interpretieren, was Regeln es will. Es kann sogar mit bedingter Logik interpretieren, die auch wie Content-Type auf andere Header beziehen, die in Anhang 2 führt:

Hinweis 2: Wenn ein Web-Browser ist die primäre Art, wie Menschen Ihre Web-Anwendung zugreifen, und application / x-www-form-urlencoded wird der Content-Type sie sind Entsendung, dann Sie sollte , die Regeln für das Content-Type folgen. Und die Regeln für application / x-www-form-urlencoded sind viel spezifischer (und ehrlich gesagt, ungewöhnlich): In diesem Fall müssen Sie den URI als einen Satz von Parametern interpretieren und nicht einer Bezugsquelle. [Dies ist der gleiche Punkt der Nützlichkeit Powerlord angehoben; dass es schwer zu verwenden Web-Formulare können Inhalte auf den Server zu senden. Nur erklärt ein wenig anders.]

Anmerkung 3: Was sind Query-Strings ursprünglich für? RFC 3986 definiert HTTP Query-Strings als URI Teil, der als nicht-hierarchische Art und Weise arbeitet, um eine Ressource zu lokalisieren.

Bei Leser diese Frage wollen fragen, was gut REST-Architektur: die RESTful-Architektur Muster erfordert keine URI-Systeme eine bestimmte Art und Weise zu arbeiten. RESTful-Architektur beschäftigt sich mit anderen Eigenschaften des Systems, wie Cachebarkeit von Ressourcen, die Gestaltung der Ressourcen selbst (ihr Verhalten, Fähigkeiten und Vorstellungen), und ob idempotence erfüllt ist. Oder mit anderen Worten, das Erreichen eine Konstruktion, die mit HTTP-Protokoll und dessen Satz von HTTP-Methode Verben in hohem Maße kompatibel ist. :-) (Mit anderen Worten, RESTful-Architektur ist nicht sehr presciptive mit, wie die Ressourcen befindet ).

Schlussbemerkung: manchmal Abfrageparameter für noch andere Dinge zu gewöhnen, die weder Ortungs Ressourcen noch Codierung Inhalt sind. Immer einen Abfrageparameter wie ‚PUT = true‘ oder ‚POST = true‘ gesehen? Dies sind Abhilfen für Browser, die nicht zulassen, Sie PUT und POST-Methoden verwenden. Während solche Parameter als Teil der Zeichenfolge URL-Abfrage zu sehen sind (auf dem Draht), ich argumentieren, dass sie nicht Teil der Abfrage URL sind in Geist .

Sie wollen Gründe? Ist hier ein:

Ein Web-Formular kann nicht verwendet werden, um eine Anforderung an einer Seite zu senden, die eine Mischung aus GET und POST verwendet. Wenn Sie das Formular-Methode auf GET, alle sind die Parameter in der Query-String. Wenn Sie die Form der Methode POST gesetzt, alle sind die Parameter in der Anfrage Körper.

Quelle: HTML 4.01 Standard, Abschnitt 17.13 Formular Submission

Von einem programmatischen Standpunkt, für die Kunden es Parameter Verpackung und sie auf die URL anhang und eine POST im Vergleich zu einem GET durchgeführt wird. Auf der Server-Seite, ist deren Auswertung Eingangsparameter vom Abfragezeichenfolgeflag anstelle der entsandten Bytes. Im Grunde ist es eine Wäsche.

Wo es von Vorteil sein könnte / Nachteile könnten in sein, wie bestimmte Client-Plattformen mit POST und GET arbeiten Routinen in ihrem Netzwerk-Stack, als auch, wie die Web-Server behandelt die Anfragen. Je nach Implementierung kann ein Ansatz effizienter sein als die andere. Zu wissen, dass Ihre Entscheidung führen würde hier.

Dennoch aus Sicht des Programmierers, ziehe ich es erlaubt entweder eine POST mit allen Parametern im Körper, oder eine GET mit allen params auf die URL und URL-Parameter mit jeder POST-Anforderung explizit zu ignorieren. Es vermeidet Verwirrung.

Ich würde denken, dass es immer noch recht RESTful sein könnte Abfrage Argumente zu haben, die die Ressource auf der URL identifizieren, während der Inhalt Nutzlast auf den POST-Körper beschränkt zu halten. Dies scheint die Überlegungen zu trennen „Was soll ich zu senden?“ versus "Wer sende ich es?".

Die REST Lager haben einige Leitgedanken, dass wir die Art und Weise zu standardisieren, können wir verwenden HTTP-Verben. Dies ist hilfreich, wenn RESTful Aufbau API wie Sie tun.

Auf den Punkt gebracht: GET sollte nur gelesen werden, das heißt keine Auswirkung auf Serverstatus. POST wird verwendet, um eine Ressource auf dem Server zu erstellen. PUT verwendet, um eine Ressource zu aktualisieren oder zu erstellen. DELETE wird verwendet, um eine Ressource zu löschen.

Mit anderen Worten, wenn Ihre API Aktion des Serverstatus ändert, REST rät uns POST / PUT verwenden / DELETE, aber nicht bekommen.

Benutzerprogramme in der Regel verstehen, dass mehrere Beiträge zu tun ist schlecht und wird gegen sie warnen, weil die Absicht des POST-Server Zustand ändern (z. B. zahlen für Waren an der Kasse), und Sie wollen wahrscheinlich nicht, dass zweimal zu tun !

Vergleichen auf eine GET, die Sie ein oft tun können, wie Sie möchten (idempotent).

Ich stimme zu - es ist wahrscheinlich sicherer, eine GET-Anfrage zu verwenden, wenn Sie nur Daten in der URL und nicht im Körper vorbei. Siehe diese ähnliche Frage für einige zusätzliche Ansichten auf die ganze POST + GET-Konzept.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top