HTTP POST メソッド

HTTP POSTメソッド[1]はweb browserからWebサーバーに対して 情報を送信するために使われる。HTTPではブラウザからサーバに 対して情報を送信するためのリクエストとしては PUT, PATCH メソッドも 存在するが、この小文では触れません1

HTTP POST リクエストは、その他の HTTP リクエスト メソッドと同じように、 ヘッダー部分と情報の本体(body)からできています。 POSTは通常HTMLのformタグから送出されます。 この場合、body部分に含まれるデータは、 plain/text, application/x-www-form-urlencoded2, あるいは、 multipart/form-data のいずれかのContents-Typeになります。 画像などのデータを送信する際には、multipart/form-dataを使うことになります。 multipart/form-dataでは、ユーザーエージェント(webブラウザやpython スクリプト)が指定したバウンダリ文字列3で区分けされた複数のデータの塊を送信します。 通常、一つの塊のデータはそれぞれ MIME ヘッダ部分と body 部分を含んでいます。このヘッダ部分に、"Contents-Disposition" ヘッダーを用いて、 データのキーとなる文字列を指定します。その値は body 部分に記述します。 画像などのバイナリデータの場合には、 ヘッダ部分に”Content-Type"ヘッダーや "Content-Transfer-Encoding" ヘッダを用いて、画像のデータタイプやバイナリデータであることを記述します。 以下に multipart/form-dataを使って送信されるHTTP POSTリクエストの一例を示します。 HTTP リクエストを送信する際に、これらのヘッダを適切に設定し、本体部分のデータをこの形式に 合わせて用意することがHTTP POSTでのデータ送信に際に必要なことです。

リスト 1 multipart/form-data の一例
Connection : keep-alive
Accept-Encoding : gzip, deflate
Accept : */*
Content-Length : 9748
Content-Type : multipart/form-data; boundary=de211c23e145473d9485776a9868032e

--de211c23e145473d9485776a9868032e
Content-Disposition: form-data; name="year"

2019
--de211c23e145473d9485776a9868032e
<中略>
--de211c23e145473d9485776a9868032e
Content-Disposition: form-data; name="UserFile"; filename="imagefile.png"
Content-Type: image/png
Content-Transfer-Encoding: binary

<binary data>
--de211c23e145473d9485776a9868032e--
1

PUTは複数回同じ要求を送っても結果は変わらない(idempotent)が、POST は同じメッセージを送ると複数回送ると結果が変わってしまうことがある(non-idempotent)。これが大きな違いとなっている。

2

application/x-www-form-urlencoded では formデータは URI queryの形式と同じく、 '''&key1=value1&key2=value2& ... ''' の形でkeyとその値のリストを指定する。

3

バウンダリ文字列は、multipartに閉じ込められて送られるデータのどの一部とも一致してはいけないというルールがある(RFC7578 )。 現実的には、充分長いランダムな文字列を選択しても問題が起きないと考えられているようである。