回答:
値は、コンテンツタイプで指定されている形式で、リクエストの本文で送信されます。
通常、コンテンツタイプはapplication/x-www-form-urlencoded
であるため、リクエストの本文ではクエリ文字列と同じ形式を使用します。
parameter=value&also=another
フォームでファイルのアップロードを使用する場合は、multipart/form-data
代わりに、形式が異なるエンコーディングを使用します。より複雑ですが、通常はどのように見えるかを気にする必要がないため、例は示しませんが、存在することを知っておくとよいでしょう。
multipart/form-data
たり、リクエストの作成を担当している場合は、content-typeをに変更してapplication/json
jsonテキストをhttp本文に直接貼り付けたりできます
コンテンツはHTTPヘッダーの後に置かれます。HTTP POSTの形式は、HTTPヘッダー、空白行、リクエスト本文の順です。POST変数は、本体にキーと値のペアとして格納されます。
これは、以下に示すHTTP Postの未加工のコンテンツで確認できます。
POST /path/script.cgi HTTP/1.0
From: frog@jmarshall.com
User-Agent: HTTPTool/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 32
home=Cosby&favorite+flavor=flies
これはFiddlerなどのツールを使用して確認できます。このツールを使用すると、回線を介して送信される未加工のHTTP要求と応答のペイロードを監視できます。
application/x-www-form-urlencoded
である場合のみ。これは常に当てはまるとは限りません。
From
そこにヘッダーがあるのですか?
From
ヘッダーをランダムに含めるのが好きです。IMO 418 HTTPステータスコードが表示されます。
短い答え: POSTリクエストでは、値はリクエストの「本体」で送信されます。Webフォームでは、ほとんどのapplication/x-www-form-urlencoded
場合、メディアタイプまたはで送信されmultipart/form-data
ます。ハンドルのWeb要求に設計されているプログラミング言語やフレームワークは、通常、このような要求に「正しいこと™」を行うと、容易に復号値(のように簡単にアクセスを提供し$_REQUEST
たり$_POST
、PHPで、またはcgi.FieldStorage()
、flask.request.form
Pythonで)。
今少し違いを見てみましょう。違いを理解するのに役立ちます;)
GET
とPOST
リクエストの違いは主にセマンティックです。また、値の受け渡し方法の違いを説明するために、それらの使用方法も異なります。
GET
リクエストを実行するとき、サーバーにエンティティまたはエンティティのセットを要求します。クライアントが結果をフィルタリングできるようにするために、URLのいわゆる「クエリ文字列」を使用できます。クエリ文字列は?
。の後の部分です。これはURI構文の一部です。
したがって、アプリケーションコード(リクエストを受信する部分)の観点からは、URIクエリ部分を検査してこれらの値にアクセスする必要があります。
キーと値はURIの一部であることに注意してください。ブラウザによっては、URIの長さに制限が課される場合があります。HTTP標準では、制限はありません。ただし、この記事の執筆時点では、ほとんどのブラウザーでURI が制限されています(特定の値はありません)。サーバーに新しい情報を送信するためにGET
リクエストを使用しないでください。特に大きなドキュメントではありません。ここで、POST
またはを使用する必要がありますPUT
。
POST
リクエストを実行するとき、クライアントは実際に新しいドキュメントをリモートホストに送信しています。したがって、クエリ文字列は(意味的に)意味がありません。これが、アプリケーションコードでそれらにアクセスできない理由です。
POST
もう少し複雑な(かつある方法より柔軟):
POSTリクエストを受信するときは、常に「ペイロード」、つまりHTTPの用語であるメッセージ本文が必要です。(私が知る限り、多分application / octet-stream?)標準形式がないため、メッセージ本文自体はほとんど役に立ちません。本文の形式はContent-Type
ヘッダーによって定義されます。でHTML FORM
要素を使用する場合method="POST"
、これは通常application/x-www-form-urlencoded
です。別の非常に一般的なタイプは、ファイルのアップロードを使用する場合のmultipart / form-dataです。しかし、それは可能性が何に至るまで、text/plain
オーバー、application/json
あるいはカスタムapplication/octet-stream
。
いずれの場合でも、アプリケーションで処理できないを使用POST
してリクエストが行われたContent-Type
場合は、415
status-codeを返す必要があります。
ほとんどのプログラミング言語(および/またはウェブフレームワークが)/からの最も一般的なタイプ(のようにメッセージ本体デ/エンコードする方法を提供しapplication/x-www-form-urlencoded
、multipart/form-data
またはapplication/json
)。簡単です。カスタム型は、潜在的にもう少し多くの作業を必要とします。
例として標準のHTMLフォームでエンコードされたドキュメントを使用して、アプリケーションは次の手順を実行する必要があります。
Content-Type
フィールドを読む415
ステータスコードを含む応答を返します繰り返しになりますが、PHPのような言語、または他の一般的な言語のWebフレームワークがおそらくこれを処理します。これの例外は415
エラーです。フレームワークは、アプリケーションがサポートする、またはサポートしないことを選択するコンテンツタイプを予測できません。これはあなた次第です。
PUT
要求はかなりのとまったく同じ方法で処理されるPOST
要求。大きな違いは、POST
リクエストはサーバーに新しいリソースを作成する方法(および、もしあれば)を決定させることです。歴史的に(現在は廃止されたRFC2616から、リクエストが送信されたURIの「下位」(子)として新しいリソースを作成することでした)。
PUT
対照的に、要求が正確に「預金」のリソースになっている時、そのURI、およびとまさにそのコンテンツ。それ以上でもそれ以下でもありません。アイデアは、クライアントが「PUT」する前に完全なリソースを作成する責任があるということです。サーバはそれを受け入れる必要があり、あるとして指定されたURLに。
その結果、POST
リクエストは通常、既存のリソースを置き換えるために使用されません。PUT
要求は、両方やる作成することができますし、交換してください。
リモートに追加のデータを送信するために使用できる「パスパラメータ」もありますが、あまり一般的ではないので、ここではあまり詳しく説明しません。ただし、参考までに、RFCからの抜粋を以下に示します。
階層パスのドットセグメントは別として、パスセグメントは一般的な構文では不透明と見なされます。URI生成アプリケーションでは、多くの場合、セグメントで許可されている予約文字を使用して、スキーマ固有または逆参照ハンドラ固有のサブコンポーネントを区切ります。たとえば、セミコロン( ";")および等号( "=")の予約文字は、そのセグメントに適用可能なパラメーターとパラメーター値を区切るためによく使用されます。コンマ( "、")予約文字は、同様の目的でよく使用されます。たとえば、あるURIプロデューサーは「name; v = 1.1」などのセグメントを使用して「name」のバージョン1.1への参照を示し、別のURIプロデューサーは「name、1.1」などのセグメントを使用して同じことを示す場合があります。パラメータタイプは、スキーム固有のセマンティクスによって定義できます。
PUT
セクションの2番目の段落を読むと、べき等であることがわかります。POST
対照的に-定義により-できません。POST
常に新しいリソースを作成します。PUT
同じリソースが存在する場合は、それを置き換えます。したがって、POST
10回呼び出すと、10個のリソースが作成されます。PUT
10回呼び出すと、(たぶん)1つだけ作成されます。それはあなたの質問に答えますか?
ブラウザのURLバーに直接入力することはできません。
たとえば、ライブHTTPヘッダーを使用して、POSTデータがインターネット上でどのように送信されるかを確認できます。結果はそのようなものになります
http://127.0.0.1/pass.php
POST /pass.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Referer: http://127.0.0.1/pass.php
Cookie: passx=87e8af376bc9d9bfec2c7c0193e6af70; PHPSESSID=l9hk7mfh0ppqecg8gialak6gt5
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
username=zurfyx&pass=password
それが言うところ
Content-Length: 30
username=zurfyx&pass=password
ポスト値になります。
Content-Length
はず29
ですか?これが実際の文字列の長さですusername=zurfyx&pass=password
。
POSTリクエストのデフォルトのメディアタイプはapplication/x-www-form-urlencoded
です。これは、キーと値のペアをエンコードするための形式です。キーは重複する可能性があります。各キーと値のペアは&
文字で区切られ、各キーはその値から文字で区切られます=
。
例えば:
Name: John Smith
Grade: 19
次のようにエンコードされます:
Name=John+Smith&Grade=19
これは、HTTPヘッダーの後のリクエスト本文に配置されます。
HTTP POSTのフォーム値は、クエリ文字列と同じ形式でリクエストの本文で送信されます。
詳細については、仕様をご覧ください。
?
は例えばから始まりますか?
application/x-www-form-urlencoded
である場合のみ。これは常に当てはまるとは限りません。
一部のWebサービスでは、リクエストデータとメタデータを別々に配置する必要があります。たとえば、リモート関数は、署名されたメタデータ文字列がURIに含まれていることを予期している場合がありますが、データはHTTPボディに投稿されます。
POSTリクエストは、意味的には次のようになります。
POST /?AuthId=YOURKEY&Action=WebServiceAction&Signature=rcLXfkPldrYm04 HTTP/1.1
Content-Type: text/tab-separated-values; charset=iso-8859-1
Content-Length: []
Host: webservices.domain.com
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: identity
User-Agent: Mozilla/3.0 (compatible; Indy Library)
name id
John G12N
Sarah J87M
Bob N33Y
このアプローチContent-Type
は、Webサーバー用の「解析命令」である単一を使用して、QueryStringとBody-Postを論理的に組み合わせます。
ご注意: HTTP / 1.1がされてラップで#32
左にと付き(スペース)#10
を右に(改行)。
/user/john
と/?user=john
合理的に予想通り、私はこれを取るので、単にセマンティック1(HTTPは実際にクエリ文字列に特別な治療を与えるものではありません)です。しかし、「左側のスペースに包まれている」とはどういう意味ですか?HTTPメソッドの前にスペースはありません。投稿本文の空白行ですか?
...Ym04
ありHTTP/1.1
ます。したがって、QueryStringは動詞とプロトコルバージョンの間に存在します。
?
行うようにURIとパラメーターを分離することで、URLの一部としてクエリパラメーターを渡すことができるのは事実ですGET
。
まず、GET
とを区別しましょうPOST
取得:これは、デフォルトでHTTP
サーバーに作られており、後に来るサーバーおよびクエリ文字列からデータを取得するために使用され、要求?
にURI
ユニークなリソースを取得するために使用されます。
これはフォーマットです
GET /someweb.asp?data=value HTTP/1.0
ここでdata=value
渡されたクエリ文字列値です。
POST:データをサーバーに安全に送信するために使用されるため、必要なものはすべてPOST
リクエストの形式です。
POST /somweb.aspHTTP/1.0
Host: localhost
Content-Type: application/x-www-form-urlencoded //you can put any format here
Content-Length: 11 //it depends
Name= somename
POST over GETを使用する理由
ではGET
通常、クエリ文字列のベースURLに追加されているサーバーに送信された値が、今、このの2つの結果があります
GET
要求は、パラメータを指定して、ブラウザの履歴に保存されています。したがって、パスワードは暗号化されずにブラウザの履歴に残ります。これは、当時のFacebookにとって本当の問題でした。URI
があります。送信されるパラメータが多すぎる場合、受け取る可能性があります414 Error - URI too long
投稿リクエストの場合、フィールドからのデータが代わりに本文に追加されます。要求パラメーターの長さが計算され、content-lengthのヘッダーに追加されます。重要なデータはURLに直接追加されません。
Googleデベロッパーツールのネットワークセクションを使用して、サーバーへのリクエストの作成方法に関する基本情報を確認できます。
あなたは常にあなたの中に複数の値を追加することができますRequest Headers
ようにCache-Control
、Origin
、Accept
。
HTTPS
接続のコンテキストでのみ当てはまりますHTTP
。(クエリパラメータを含む)とのHTTPS
両方を暗号化しURL
ます(どちらも暗号化/保護しないRequest Body
場合)HTTP
。説明されている問題は、多くのブラウザが(通常は暗号化されていない)履歴データベースに(URIs
を含むURLs
)を保存しているという事実から来ています。したがって、機密情報にはRequest Body
+ のみを使用してくださいHTTPS
。
multipart/form-data
。興味のある方のために、ここでそれについて質問します。