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-urlencoded
oder 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 $_REQUEST
oder $_POST
in PHP, oder cgi.FieldStorage()
, flask.request.form
in Python).
Lassen Sie uns jetzt ein wenig abschweifen, was helfen kann, den Unterschied zu verstehen;)
Der Unterschied zwischen GET
und POST
Anforderungen ist weitgehend semantisch. Sie werden auch unterschiedlich "verwendet", was den Unterschied in der Übergabe von Werten erklärt.
Wenn Sie eine GET
Anforderung 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). GET
Anforderungen sollten niemals verwendet werden, um neue Informationen an den Server zu senden. Besonders nicht größere Dokumente. Dort sollten Sie POST
oder verwenden PUT
.
Bei der Ausführung einer POST
Anforderung 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.
POST
ist 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-Type
Header definiert . Bei Verwendung eines HTML- FORM
Elements 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/json
oder sogar ein Brauch application/octet-stream
.
In jedem Fall sollte eine POST
Anforderung mit einem, Content-Type
der von der Anwendung nicht verarbeitet werden kann, einen 415
Statuscode 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-data
oder 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-Type
Feld
- Wenn der Wert nicht zu den unterstützten Medientypen gehört, geben Sie eine Antwort mit einem
415
Statuscode 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 415
Fehler. Kein Framework kann vorhersagen, welche Inhaltstypen Ihre Anwendung unterstützt und / oder nicht unterstützt. Es liegt an dir.
Eine PUT
Anfrage wird genauso behandelt wie eine POST
Anfrage. Der große Unterschied besteht darin, dass POST
der 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 PUT
Gegensatz 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 POST
Anforderung normalerweise nicht zum Ersetzen einer vorhandenen Ressource verwendet. Eine PUT
Anfrage 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 .