Kurze Antwort: Bei POST-Anfragen werden Werte im "Body" der Anfrage gesendet. Bei Webformularen werden sie höchstwahrscheinlich mit einem Medientyp von application/x-www-form-urlencodedoder gesendet multipart/form-data. Programmiersprachen oder Frameworks , die zu handhaben Web-Anfragen entwickelt wurden , in der Regel tun „The Right Thing ™“ mit solchen Anforderungen und bieten Ihnen einen einfachen Zugang zu den leicht dekodiert Werte (wie $_REQUESToder $_POSTin PHP, oder cgi.FieldStorage(), flask.request.formin Python).
Lassen Sie uns jetzt ein wenig abschweifen, was helfen kann, den Unterschied zu verstehen;)
Der Unterschied zwischen GETund POSTAnforderungen ist weitgehend semantisch. Sie werden auch unterschiedlich "verwendet", was den Unterschied in der Übergabe von Werten erklärt.
Wenn Sie eine GETAnforderung ausführen , fragen Sie den Server nach einer oder mehreren Entitäten. Damit der Client das Ergebnis filtern kann, kann er die sogenannte "Abfragezeichenfolge" der URL verwenden. Die Abfragezeichenfolge ist der Teil nach dem ?. Dies ist Teil der URI-Syntax .
Aus Sicht Ihres Anwendungscodes (des Teils, der die Anforderung empfängt ) müssen Sie den URI-Abfrageteil untersuchen, um Zugriff auf diese Werte zu erhalten.
Beachten Sie, dass die Schlüssel und Werte Teil des URI sind. Browser können die URI-Länge begrenzen. Der HTTP-Standard besagt, dass es keine Begrenzung gibt. Aber zum Zeitpunkt des Schreibens dieses Artikels, den meisten Browsern nicht begrenzen die URIs (Ich habe keine bestimmten Werte haben). GETAnforderungen sollten niemals verwendet werden, um neue Informationen an den Server zu senden. Besonders nicht größere Dokumente. Dort sollten Sie POSToder verwenden PUT.
Bei der Ausführung einer POSTAnforderung sendet der Client tatsächlich ein neues Dokument an den Remote-Host. Eine Abfragezeichenfolge ist also (semantisch) nicht sinnvoll. Aus diesem Grund haben Sie in Ihrem Anwendungscode keinen Zugriff darauf.
POSTist ein wenig komplizierter (und Weise flexibler):
Wenn Sie eine POST-Anfrage erhalten, sollten Sie immer eine "Nutzlast" oder, in HTTP-Begriffen, einen Nachrichtentext erwarten . Der Nachrichtentext an sich ist ziemlich nutzlos, da es kein Standardformat gibt (soweit ich das beurteilen kann. Vielleicht Anwendungs- / Oktett-Stream?). Das Body-Format wird durch den Content-TypeHeader definiert . Bei Verwendung eines HTML- FORMElements mit method="POST"ist dies normalerweise der Fall application/x-www-form-urlencoded. Ein weiterer sehr häufiger Typ sind mehrteilige / Formulardaten, wenn Sie Datei-Uploads verwenden. Aber es könnte alles sein , von text/plain, über application/jsonoder sogar ein Brauch application/octet-stream.
In jedem Fall sollte eine POSTAnforderung mit einem, Content-Typeder von der Anwendung nicht verarbeitet werden kann, einen 415Statuscode zurückgeben .
Die meisten Programmiersprachen (und / oder Web-Frameworks) bieten eine Möglichkeit , de / kodieren der Nachrichtentext von / zu den häufigsten Arten (wie application/x-www-form-urlencoded, multipart/form-dataoder application/json). Das ist also einfach. Benutzerdefinierte Typen erfordern möglicherweise etwas mehr Arbeit.
Am Beispiel eines Standarddokuments mit HTML-Formular sollte die Anwendung die folgenden Schritte ausführen:
- Lesen Sie das
Content-TypeFeld
- Wenn der Wert nicht zu den unterstützten Medientypen gehört, geben Sie eine Antwort mit einem
415Statuscode zurück
- Andernfalls dekodieren Sie die Werte aus dem Nachrichtentext.
Auch hier werden Sprachen wie PHP oder Web-Frameworks für andere beliebte Sprachen dies wahrscheinlich für Sie erledigen. Die Ausnahme ist der 415Fehler. Kein Framework kann vorhersagen, welche Inhaltstypen Ihre Anwendung unterstützt und / oder nicht unterstützt. Es liegt an dir.
Eine PUTAnfrage wird genauso behandelt wie eine POSTAnfrage. Der große Unterschied besteht darin, dass POSTder Server durch eine Anforderung entscheiden soll, wie (und wenn überhaupt) eine neue Ressource erstellt werden soll. In der Vergangenheit (ab dem inzwischen veralteten RFC2616 sollte eine neue Ressource als "Untergebener" (untergeordnetes Element) des URI erstellt werden, an den die Anforderung gesendet wurde).
Im PUTGegensatz dazu soll eine Anfrage eine Ressource genau an dieser URI und mit genau diesem Inhalt "hinterlegen" . Nicht mehr und nicht weniger. Die Idee ist, dass der Kunde dafür verantwortlich ist, die gesamte Ressource zu erstellen, bevor er sie "einfügt". Der Server sollte es so akzeptieren, wie es unter der angegebenen URL ist.
Infolgedessen wird eine POSTAnforderung normalerweise nicht zum Ersetzen einer vorhandenen Ressource verwendet. Eine PUTAnfrage kann sowohl erstellt als auch ersetzt werden.
Randnotiz
Es gibt auch " Pfadparameter ", mit denen zusätzliche Daten an die Fernbedienung gesendet werden können, aber sie sind so ungewöhnlich, dass ich hier nicht zu sehr ins Detail gehen werde. Als Referenz hier ein Auszug aus dem RFC:
Abgesehen von Punktsegmenten in hierarchischen Pfaden wird ein Pfadsegment von der generischen Syntax als undurchsichtig angesehen. URI-produzierende Anwendungen verwenden häufig die in einem Segment zulässigen reservierten Zeichen, um schemaspezifische oder Dereferenzierungshandler-spezifische Unterkomponenten abzugrenzen. Beispielsweise werden die reservierten Zeichen Semikolon (";") und Gleich ("=") häufig verwendet, um Parameter und Parameterwerte abzugrenzen, die für dieses Segment gelten. Das reservierte Komma (",") wird häufig für ähnliche Zwecke verwendet. Beispielsweise könnte ein URI-Produzent ein Segment wie "name; v = 1.1" verwenden, um einen Verweis auf Version 1.1 von "name" anzugeben, während ein anderer ein Segment wie "name, 1.1" verwenden könnte, um dasselbe anzugeben. Parametertypen können durch schemaspezifische Semantik definiert werden.
multipart/form-data. Für Interessierte ist hier eine Frage dazu .