社内研修「HTTPから学ぶTCP/IP基礎」(6)

こんにちはOISエンジニアのただっしーです。
前回までHTTPリクエストのメッセージヘッダについて説明しました。(長かったですが)
引き続き、今回はリクエスト本体の説明から始めます。
リクエストの本体は、メソッドによって内容が変わってきますので、GETとPOSTでそれぞれどうなっているか見てみます。

GETの場合

GETメソッドの場合は、リクエスト本体はありません。リクエストは「開始行」と「メッセージヘッダ」のみとなります。
ただ、GETメソッドの場合でも、動的にレスポンスが変わる検索画面のようなWebページの場合は、検索条件をWebサーバに送りたい場合があります。GETメソッドでパラメータを送りたい場合は、URLの中にパラメータを記載します。
例)http://www.ois-yokohama.co.jp/works/?p=49
?以降のp=49がパラメータです。key=valueの形で表現します。、複数ある場合は&でつないで、
key1=value1&key2=value2のように記載します。

POSTの場合

まず、ファイルのアップロードがないHTMLフォームから送った場合は、GETのパラメータと同様の内容が本体部に入ります。例えば、以下のような形です。
key1=value1&key2=value2&key3=value3
リクエストのメッセージヘッダの回では説明できていませんでしたが、GETと異なり、POSTの場合はリクエストのメッセージには、Content-TypeとContent-Lengthの2つのヘッダフィールドが付きます。Content-TypeはMIMEタイプと呼ばれる送信データの種類が指定され、Content-Lengthには送信データのバイト数が設定されます。
Content-Type:application/x-www-form-urlencoded
Content-Length:423
ファイルアップロードがないHTMLフォームの場合は、x-www-form-urlencodedがContent-Typeに設定されます。

POSTでファイルをアップロードする場合

ファイルのアップロードをする場合は、formタグのenctype属性にmultipart/form-dataを指定する必要があります。
<form action=”./” method=”post” enctype=”multipart/form-data”>
enctype=”multipart/form-data”を設定することによって、ファイルのアップロードが可能になります。
メッセージヘッダのContent-Typeは以下のようになります。
Content-Type:multipart/form-data; boundary=-----------26841326868719

MIMEタイプはformタグのenctype属性で指定したのと同じ、multipart/form-dataになります。その後ろについているboundaryは、リクエスト本体に設定されるデータを区切るための記号です。値はランダムに設定されます。
本体の中身はboundaryで指定された区切り文字で、項目ごとに区切られています。
以下の例はmyname=oisという情報と、file.txtというテキストファイルしています。
-------------26841326868719
Content-Disposition: form-data; name="myname"

ois
-------------26841326868719
Content-Disposition: form-data; name="profile"; filename="file.txt"
Content-Type: text/plain

~~ファイルの中身~~
-------------26841326868719--

以上のように、ファイルをアップロードする場合としない場合では、リクエスト本体の形式がかなり違います。ですが、ApacheやnginxなどのWebサーバソフトウェアが隠蔽して差異を吸収しているので、Webアプリケーション開発時は、例えば、PHPだと$_POST[‘name’]、JavaサーブレットだとServletRequestクラスのgetParameter(“name”)のように、リクエスト本体の形式を意識せず利用できます。

第6回は以上で終了です。

次回からHTTPレスポンスについて説明していきます。