Nutzdaten von HTTP-Anforderungsmethoden

68

Der Wikipedia-Eintrag zu HTTP listet die folgenden HTTP-Anforderungsmethoden auf:

  • HEAD: Fragt nach der Antwort, die mit der identisch ist, die einer GET-Anforderung entsprechen würde, jedoch ohne den Antworttext.
  • GET: Fordert eine Darstellung der angegebenen Ressource an.
  • POST: Sendet zu verarbeitende Daten (z. B. aus einem HTML-Formular) an die identifizierte Ressource. Die Daten sind im Hauptteil der Anfrage enthalten.
  • PUT: Lädt eine Darstellung der angegebenen Ressource hoch.
  • LÖSCHEN: Löscht die angegebene Ressource.
  • TRACE: Gibt die empfangene Anforderung zurück, sodass ein Client sehen kann, welche (falls vorhanden) Änderungen oder Ergänzungen von Zwischenservern vorgenommen wurden.
  • OPTIONEN: Gibt die HTTP-Methoden zurück, die der Server für die angegebene URL unterstützt. Dies kann verwendet werden, um die Funktionalität eines Webservers zu überprüfen, indem '*' anstelle einer bestimmten Ressource angefordert wird.
  • CONNECT: Konvertiert die Anforderungsverbindung in einen transparenten TCP / IP-Tunnel, um normalerweise die SSL-verschlüsselte Kommunikation (HTTPS) über einen unverschlüsselten HTTP-Proxy zu ermöglichen.
  • PATCH: Wird verwendet, um teilweise Änderungen an einer Ressource vorzunehmen .

Ich bin daran interessiert zu wissen (speziell in Bezug auf die ersten fünf Methoden):

  • Welche dieser Methoden können (sollen?) Nutzdaten empfangen?
    • Wie empfangen sie die Methoden, die Nutzdaten empfangen können?
      • über Abfragezeichenfolge in URL?
      • über URL-codierten Körper?
      • über rohen / klobigen Körper?
      • über eine Kombination von ([allen / einigen]) der oben genannten?

Ich freue mich über jede Eingabe, wenn Sie etwas (vorzugsweise leichtes) Lesen teilen könnten, wäre das auch großartig!

Alix Axel
quelle

Antworten:

32

RFC 7231 , HTTP 1.1-Semantik und -Inhalt, ist die aktuellste und maßgeblichste Quelle für die Semantik der HTTP-Methoden. Diese Spezifikation besagt, dass es keine definierte Bedeutung für eine Nutzlast gibt, die in einer GET-, HEAD-, OPTIONS- oder CONNECT-Nachricht enthalten sein kann. In Abschnitt 4.3.8 heißt es, dass der Client keinen Text für eine TRACE-Anforderung senden darf. Daher kann nur TRACE keine Nutzlast haben, GET, HEAD, OPTIONS und CONNECT jedoch wahrscheinlich nicht, und es wird nicht erwartet, dass der Server weiß, wie er damit umgeht, wenn der Client eine sendet (was bedeutet, dass er sie ignorieren kann).

Wenn Sie der Meinung sind, dass etwas nicht eindeutig ist, gibt es eine Mailingliste, auf der Sie Ihre Bedenken äußern können.

Darrel Miller
quelle
Ich muss es noch genauer lesen, aber es scheint, dass der HTTPBis-Entwurf die Art von Details enthält, die ich mir erhofft hatte. Vielen Dank!
Alix Axel
Ich bin mir nicht sicher, was "maßgeblich" ist, da es sich immer noch um Entwürfe handelt, die Änderungen unterliegen. Dennoch stimme ich zu, dass sie nützlich sind, um Unklarheiten in RFC 2616 zu klären.
Matt Kantor
90

Hier ist die Zusammenfassung von RFC 7231 , einer aktualisierten Version des Links @Darrel :

  • HEAD - Keine definierte Körpersemantik.
  • GET - Keine definierte Körpersemantik.
  • PUT - Körper unterstützt.
  • POST - Körper unterstützt.
  • LÖSCHEN - Keine definierte Körpersemantik.
  • TRACE - Körper wird nicht unterstützt.
  • OPTIONEN - Körper unterstützt, aber keine Semantik zur Verwendung (möglicherweise in der Zukunft).
  • CONNECT - Keine definierte Körpersemantik

Wie auch @John erwähnt hat, unterstützen alle Anforderungsmethoden Abfragezeichenfolgen in der URL (eine bemerkenswerte Ausnahme könnten OPTIONEN sein, die [in meinen Tests] nur dann nützlich zu sein scheinen, wenn die URL lautet HOST/*).

Ich habe nicht die getestet CONNECT und PATCH Methoden , da ich kein Interesse an ihnen ATM haben.

Alix Axel
quelle
1
OPTIONEN verwendet denselben Satz von URIs wie jede andere Methode und gilt dann für diese Ressource. Es ist nur etwas Besonderes für "*".
Julian Reschke
Könnte Connect eine Nutzlast haben?
CMCDragonkai
@CMCDragonkai: "Körper in CONNECT-Anforderungen haben keine definierte Semantik. Beachten Sie, dass das Senden eines Körpers in einer CONNECT-Anforderung dazu führen kann, dass einige vorhandene Implementierungen die Anforderung ablehnen."
Alix Axel
@AlixAxel Könnten Sie die fehlenden WebDAV-Verben zur Liste hinzufügen ? Es ist noch nicht erschöpfend genug, um die akzeptierte Antwort zu sein.
Knu
Ist die Stelle in einer PUT-Anfrage nicht obligatorisch? Es soll eine vollständige Darstellung der Ressource kapseln, die die Ressource am angegebenen URI ersetzt.
Kev
3

Ich bin mir ziemlich sicher, dass nicht klar ist, ob GET-Anforderungen Nutzdaten haben können oder nicht. GET-Anforderungen senden im Allgemeinen Formulardaten über die Abfragezeichenfolge, genau wie HEAD-Anforderungen. HEAD ist im Wesentlichen GET - außer es möchte keinen Antwortkörper.

(Randnotiz: Ich sage, es ist nicht klar, weil eine GET-Anforderung technisch auf ein anderes Protokoll aktualisiert werden könnte. Tatsächlich hat eine Version von Websockets genau dies getan, und während einige Proxy-Software gut damit funktionierte, waren andere beim Handshake blockiert.)

POST hat im Allgemeinen einen Körper. Nichts hindert Sie daran, eine Abfragezeichenfolge zu verwenden, aber der POST-Text enthält im Allgemeinen Formulardaten in einem POST.

Für mehr (und detailliertere) Informationen würde ich die tatsächlichen HTTP / 1.1-Spezifikationen treffen .

John Chadwick
quelle
Wenn ich Payload sage, beziehe ich mich auch auf die Daten, die in der URL ausgeführt werden, als Abfragezeichenfolge. Ich weiß, POSTdass Nutzdaten über einen URL-codierten Text und / oder eine URL-Abfragezeichenfolge erwartet werden. GETunterstützt Nutzlasten über Query - String - URL und ich denke , das gleiche mit den beiden passiert , HEADund , DELETEaber ich bin nicht 100% sicher darüber. Ich habe Abschnitt 9 des HTTP / 1.1-RFC gelesen, aber es scheint mir nicht sehr klar zu sein.
Alix Axel
3
Es ist nicht ganz klar, ob DELETEAnfragen einen Text haben können oder nicht . Nichts im HTTP / 1.1-RFC verbietet dies jedoch. Und nun, eine Abfragezeichenfolge kann in jeder Anforderung enthalten sein, nicht nur GET, HEADund DELETE- die Tatsache, dass Formulardaten an body in POSTund Abfragezeichenfolge in GETgesendet werden, hängt möglicherweise mehr mit HTML zusammen als alles andere.
John Chadwick
3
Es ist ganz klar dargelegt in Httpbis was es bedeutet , einen Körper in einer DELETE zu senden tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-14#page-20 Es bedeutet nicht , alles und einige bestehende Internetkomponenten können dies ablehnen. Gleiches gilt für GET.
Darrel Miller
@Darrel Miller: Oh okay, das wusste ich nicht.
John Chadwick
2
Das Ziel der Httpbis-Spezifikation ist es, die Dinge zu klären, die RFC2616 vergessen oder nicht gut gesagt hat.
Darrel Miller