In einer HTTP- GET- Anforderung werden Parameter als Abfragezeichenfolge gesendet :
http://example.com/page ? parameter = value & also = ein anderer
In einer HTTP- POST- Anforderung werden die Parameter nicht zusammen mit dem URI gesendet.
Wo sind die Werte? Im Anforderungsheader? Im Anfragetext? Wie sieht es aus?
multipart/form-data
. Für Interessierte ist hier eine Frage dazu .multipart/form-data
oder wenn Sie für die Erstellung von Anforderungen verantwortlich sind, den Inhaltstyp ändernapplication/json
und JSON-Text direkt in den http-TextDer Inhalt wird nach den HTTP-Headern eingefügt. Das Format eines HTTP-POST besteht darin, dass die HTTP-Header gefolgt von einer Leerzeile und dem Anforderungshauptteil angezeigt werden. Die POST-Variablen werden als Schlüssel-Wert-Paare im Body gespeichert.
Sie können dies im folgenden Rohinhalt eines HTTP-Posts sehen:
Sie können dies mit einem Tool wie Fiddler anzeigen , mit dem Sie die rohen HTTP-Anforderungs- und Antwortnutzdaten überwachen können, die über die Leitung gesendet werden.
quelle
application/x-www-form-urlencoded
, was nicht immer der Fall ist.From
Header haben?From
Headers. IMO ist es dort oben mit dem 418 HTTP-Statuscode.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 gesendetmultipart/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, odercgi.FieldStorage()
,flask.request.form
in Python).Lassen Sie uns jetzt ein wenig abschweifen, was helfen kann, den Unterschied zu verstehen;)
Der Unterschied zwischen
GET
undPOST
Anforderungen ist weitgehend semantisch. Sie werden auch unterschiedlich "verwendet", was den Unterschied in der Übergabe von Werten erklärt.GET ( relevanter RFC-Abschnitt )
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 SiePOST
oder verwendenPUT
.POST ( relevanter RFC-Abschnitt )
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 mitmethod="POST"
ist dies normalerweise der Fallapplication/x-www-form-urlencoded
. Ein weiterer sehr häufiger Typ sind mehrteilige / Formulardaten, wenn Sie Datei-Uploads verwenden. Aber es könnte alles sein , vontext/plain
, überapplication/json
oder sogar ein Brauchapplication/octet-stream
.In jedem Fall sollte eine
POST
Anforderung mit einem,Content-Type
der von der Anwendung nicht verarbeitet werden kann, einen415
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
oderapplication/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:
Content-Type
Feld415
Statuscode zurückAuch 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.PUT ( relevanter RFC-Abschnitt )
Eine
PUT
Anfrage wird genauso behandelt wie einePOST
Anfrage. Der große Unterschied besteht darin, dassPOST
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. EinePUT
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:
quelle
PUT
Abschnitt werden Sie sehen , dass es ist idempotent.POST
im Gegensatz dazu kann - per Definition - nicht sein.POST
wird immer eine neue Ressource erstellen.PUT
wird, wenn eine identische Ressource vorhanden ist, diese ersetzen. Wenn Sie alsoPOST
10 Mal anrufen , erstellen Sie 10 Ressourcen. Wenn SiePUT
10 Mal anrufen , wird (vielleicht) nur eines erstellt. Beantwortet das deine Frage?Sie können es nicht direkt in die URL-Leiste des Browsers eingeben.
Sie können beispielsweise mit Live-HTTP-Headern sehen, wie POST-Daten im Internet gesendet werden . Ergebnis wird so etwas sein
Wo steht
werden die Post-Werte sein.
quelle
Content-Length
soll29
hier sein? Das ist die tatsächliche Länge der Zeichenfolgeusername=zurfyx&pass=password
.Der Standardmedientyp in einer POST-Anforderung ist
application/x-www-form-urlencoded
. Dies ist ein Format zum Codieren von Schlüssel-Wert-Paaren. Die Schlüssel können doppelt vorhanden sein. Jedes Schlüssel-Wert-Paar ist durch ein&
Zeichen getrennt, und jeder Schlüssel ist durch ein=
Zeichen von seinem Wert getrennt .Zum Beispiel:
Ist codiert als:
Dies wird im Anforderungshauptteil nach den HTTP-Headern platziert.
quelle
Formularwerte in HTTP-POSTs werden im Anforderungshauptteil im selben Format wie der Querystring gesendet.
Weitere Informationen finden Sie in der Spezifikation .
quelle
?
zum Beispiel mit einem ?application/x-www-form-urlencoded
, was nicht immer der Fall ist.Einige der Web Service benötigen Sie Platz Anfrage Daten und Metadaten getrennt. Beispielsweise kann eine Remote-Funktion erwarten, dass die signierte Metadatenzeichenfolge in einem URI enthalten ist, während die Daten in einem HTTP-Body veröffentlicht werden.
Die POST-Anforderung kann semantisch folgendermaßen aussehen:
Dieser Ansatz kombiniert QueryString und Body-Post logisch mit einer einzigen,
Content-Type
die eine "Parsing-Anweisung" für einen Webserver darstellt.Bitte beachten Sie: HTTP / 1.1 wird mit dem (Leerzeichen) links und mit (Zeilenvorschub) rechts umbrochen .
#32
#10
quelle
/user/john
und/?user=john
ist lediglich ein semantischer Unterschied (HTTP behandelt Abfragezeichenfolgen nicht wirklich speziell), daher nehme ich dies als vernünftigerweise erwartet an. Aber was meinst du mit "links vom Leerzeichen umhüllt"? Vor der HTTP-Methode stehen keine Leerzeichen. Du meinst die leere Zeile für Postkörper?...Ym04
undHTTP/1.1
im obigen Code befindet sich ein Leerzeichen (ASCII # 32) . Ein QueryString befindet sich also einfach zwischen dem Verb und der Protokollversion.?
wie wir es beiGET
Anfragen tun .Lassen Sie uns zunächst zwischen
GET
und unterscheidenPOST
Get: Dies ist die Standardanforderung
HTTP
, die an den Server gestellt wird und zum Abrufen der Daten vom Server verwendet wird. Die Abfragezeichenfolge, die?
in aURI
folgt, wird zum Abrufen einer eindeutigen Ressource verwendet.Das ist das Format
Hier
data=value
wird der Wert der Abfragezeichenfolge übergeben.POST: Es wird verwendet, um Daten sicher an den Server zu senden. Alles, was benötigt wird, ist das Format einer
POST
AnfrageWarum POST über GET?
In
GET
dem Wert für die Server sind in der Regel auf die Basis - URL in dem Query - String angehängt gesendet werden, jetzt gibt es zwei Folgen davonGET
Anfragen werden mit den Parametern im Browserverlauf gespeichert. So bleiben Ihre Passwörter im Browserverlauf unverschlüsselt. Dies war damals ein echtes Problem für Facebook.URI
kann. Wenn zu viele Parameter gesendet werden, erhalten Sie möglicherweise414 Error - URI too long
Im Falle einer Nachanfrage werden stattdessen Ihre Daten aus den Feldern dem Text hinzugefügt. Die Länge der Anforderungsparameter wird berechnet und dem Header für die Inhaltslänge hinzugefügt, und es werden keine wichtigen Daten direkt an die URL angehängt.
Im Netzwerkbereich der Google Developer Tools können Sie grundlegende Informationen dazu anzeigen, wie Anforderungen an die Server gestellt werden.
und Sie können immer mehr Werte in Ihrer hinzufügen
Request Headers
wieCache-Control
,Origin
,Accept
.quelle
HTTPS
Verbindung, nichtHTTP
.HTTPS
verschlüsselt sowohl dieURL
(einschließlich der Abfrageparameter) als auch dieRequest Body
, wennHTTP
keine verschlüsselt / geschützt wird . Das beschriebene Problem beruht auf der Tatsache, dass viele Browser dieURIs
(einschließlichURLs
) in ihren Verlaufsdatenbanken speichern (normalerweise nicht verschlüsselt). Verwenden Sie also nur dasRequest Body
+HTTPS
für alles, was empfindlich ist.