web-dev-qa-db-ja.com

HTTP POST=メソッドはデータをQueryStringとして送信しますか?

HTTPのPOSTメソッドがデータをQueryStringとして送信するのか、データをサーバーに渡すために特別な構造を使用するのかを知りたいのですが。

実際、POSTメソッドを使用してクライアントからサーバーへの通信(たとえばFiddlerを使用))で通信を分析すると、QueryStringは表示されませんが、名前/値のペアを持つForm Bodyコンテキストが表示されます。

52
kwichz

これを視覚化する最良の方法は、 Wireshark および TCPストリームに従う のようなパケットアナライザーを使用することです。 HTTPはTCPを使用して、数行のHTTPヘッダーで始まるデータのストリームを送信します。多くの場合、このデータはHTML、CSS、またはXMLで構成されているため読みやすいですが、インターネット経由で転送されるあらゆるタイプのデータ(実行可能ファイル、画像、ビデオなど)にすることができます。

GET要求の場合、コンピューターは特定のURLを要求し、Webサーバーは通常200ステータスコードで応答し、WebページのコンテンツはHTTP応答ヘッダーの直後に送信されます。このコンテンツは、ブラウザでWebページのソースを表示した場合に表示されるコンテンツと同じです。あなたが言及したクエリ文字列はURLの一部にすぎず、コンピューターがWebサーバーに送信するHTTP GET要求ヘッダーに含まれます。以下は、 http://accel91.citrix.com:8000/OA_HTML/OALogout.jsp?menu=Y へのHTTP GETリクエストの例で、その後にサーバーからの302リダイレクト応答が続きます。一部のHTTPヘッダーは表示ウィンドウのサイズのためにラップされ(これらは実際にはそれぞれ1行しか使用しません)、302リダイレクトにはリダイレクトされたWebページへのリンクを含む単純なHTML Webページが含まれます(ほとんどのブラウザーは302応答を自動的にリダイレクトしますHTML応答を表示する代わりに、LocationヘッダーにリストされたURLへ):

HTTP GET with 302 redirect

POSTリクエストの場合、クエリ文字列が残っている場合がありますが、これは一般的ではなく、POSTしているデータとは何の関係もありません。代わりに、WebサーバーがGET要求への応答に使用する200応答と同様に、ブラウザーからサーバーに送信されるHTTPヘッダーの直後にデータが含まれます。単純なWebフォームをPOSTする場合、このデータは 同じURLエンコードを使用してエンコードされます クエリ文字列が使用しますが、SOAP Webサービスを使用している場合は、 マルチパートMIME形式とXMLデータ を使用してエンコードされます。

たとえば、HTTP POSTからXMLベースのSOAP Webサービスへの http://192.168.24.23:8090/msh は次のようになります Wireshark Follow TCP St​​ream

HTTP POST TCP Stream

51
Greg Bray

Getはクエリ文字列(疑問符の後のすべて)を使用するのに対し、Postはメッセージ本文を使用して情報をサーバーに送り返します。同じリクエストでGetクエリ文字列とPostメッセージ本文の両方を送信することは可能ですが、少し混乱する可能性があるため、避けるのが最善です。

一般に、ベストプラクティスでは、データを取得する場合はGetを使用し、データを変更する場合はPostを使用することを規定しています。 (これらの規則は明確に設定されておらず、仕様はGetでデータを変更することを禁止していませんが、リンクをクリックするかURLを入力するだけで変更を加えたくないという理由で一般的に回避されます)

逆に、Postを使用してデータを変更せずに取得できますが、Getを使用すると、ページをブックマークしたり、他の人とURLを共有したりできます。

メッセージ本文で送信されるデータの実際の形式に関しては、送信者次第であり、Content-Typeヘッダー。指定しない場合、HTMLフォームのデフォルトのコンテンツタイプはapplication/x-www-form-urlencodedは、サーバーが投稿の本文がGETクエリ文字列と同様の方法でエンコードされた文字列であることを期待することを意味します。ただし、これはすべての場合に依存することはできません。 RFC2616では、Content-Typeヘッダーについて次のように記述されています。

エンティティ本体を含むHTTP/1.1メッセージには、
その本文のメディアタイプを定義するContent-Typeヘッダーフィールド。もし
そしてメディアタイプがContent-Typeフィールドで指定されていない場合のみ、
受信者は、その検査によってメディアタイプを推測しようとする場合があります
コンテンツおよび/または識別に使用されるURIの名前拡張子
資源。メディアタイプが不明な場合、受信者は
タイプ「application/octet-stream」として扱います。

23
GordonM

POST request canクエリ文字列を含めますが、通常は含めません-POSTアクションは通常、たとえばクエリ文字列は含まれません。

17
Justin

GETはデータをクエリ文字列として送信しますが、POSTは送信しません。むしろ、リクエストの本文で送信します。

4
ataddeini

投稿が次のURLに到達しようとした場合

mypage.php?id = 1

POSTデータがありますが、GETデータもあります。

1
jsgoupil