HTTP は Web クライアントと Web サーバ間で使用するプロトコル^1で TCP/IP [^2]のアプリケーション層のプロトコルです。
おもな Web クライアントは Web ブラウザなので Web ブラウザを想定します( 他の代表的なクライアントとして cURL などがあります)。
HTTP は Web ブラウザから Web サーバへ要求する HTTP リクエスト
と Web サーバから Web ブラウザに応答する HTTP レスポンス
で構成されます。
[^2]: 正確には TCP/IP プロトコルスウィートです。
Web ブラウザから Web サーバへ送信するメッセージを HTTP リクエストと呼びます。
HTTP リクエストは 3 要素で構成されます。
HTTP リクエストの必須部分で HTTP メソッド、リクエスト URI、HTTP プロトコルバージョンで構成されます。
リクエストラインの例)
GET /index.html HTTP1.1 # リクエストライン
リクエスト URL はパスか絶対 URI です。 リクエスト URI がパスの場合はリクエストヘッダーで Host ヘッダーを使用して URL を記載します。
GET /index.html HTTP1.1 # リクエストライン
Host: example.com:443 # リクエストヘッダー
... #
... #
絶対 URI の場合は Host ヘッダーは省略します(パスの場合は Host が必須)。
GET https://example.com/index.html HTTP1.1
メソッドは Web ブラウザが Web サーバに要求するアクションを指定します。
メソッドは後述の HTTP1.1 リクエストラインのメソッド で詳細を記載します。
Web ブラウザは付加情報をリクエストヘッダーとして Web サーバ送信します。
リクエストヘッダーの例)
Host: example.com:443
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; ja; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1
Accept: image/png,*/*;q=0.5
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
HTML フォームのデータなどを送信します。
メソッドは Web ブラウザが Web サーバに要求するアクションを表します。
HTTP1.1 は GET、 POST、 HEAD、 PUT、 OPTIONS、 DELETE、 TRACE、 CONNECT を定義しています。
実際に広く使われているのは GET と POST です。
リクエスト URI で指定したリソースを Web ブラウザへ送信する要求をします。 GET は静的リソース( .html、 htm、 gif、 jpg など)を取得するために用いられます。 またパラメータが少ないかもしくは全くない場合は動的なリソースも取得できます。
GET の ? 以降をパラメータと呼びキー=値
の組で & で区切って複数指定できます。
パラメータは URL クエリ文字列とも呼びます。
GET /cgi-bin/sample.cgi/?key1=value1&key2=value2 HTTP1.1
クエリ文字に URL として許可されていない文字を含めるときは%XX(16進数)という形で符号化します。
符号化をパーセントエンコーディングと呼びます。
デフォルトの Web ブラウザから Web サーバへの HTTP リクエストは GET です。
その他のメソッドを利用するようにブラウザの動きを変更できます。
HTML の FORM 要素の action 属性に POST を指定することで POST メソッドを使用できます。
Web ブラウザから Web サーバにデータを送信( HTML フォームから)するときに使用します。 データはメッセージボディとして送信されます。
通常はメッセージボディーのメタ情報として Content-Type や Content-Length などの行をリクエストヘッダーに付加して送信します。
リクエストメッセージの例 POST)
POST /cgi-bin/htmlform.cgi HTTP1.1 # リクエストライン
Host:example.com:443 # リクエストヘッダー
User-Agent:MOZILLA1/0 #
Content-Type:application/x-www-form-urlencoded #
Content-Length: 31 #
# 空行
name=myname # メッセージボディ
password=mypasssword #
Web プログラミングの代表的な処理は HTTP リクエストの GET メソッドのクエリ文字列や POST メソッドのメッセージボディの文字列をプログラム言語で操作して適切なレスポンスを返すことです。
PHP は GET クエリ文字はスクリプト中で $_GET['key']
で取得できます。
また POST メソッドのメッセージボディは $_POST['key']
で取得できます。
Web サーバから Web ブラウザに送信した HTTP メッセージを HTTP レスポンスと呼びます。 HTTP レスポンスは3つの要素で構成されます。
HTTP レスポンスの例)
HTTP1.1 200 OK # ステータスライン
Data:Tue,01,Dec 2001 23:59:59 GMT # レスポンスヘッダー
Content-Type:text/html #
Content-Length: 47 #
# 空行
<html> # レスポンスボディ
<body> #
<h1>Hello,World!</h1> #
</body> #
</html> #
ステータスラインはそれぞれ空白で区切られた HTTP プロトコルバージョン、リクエストの結果を表すレスポンスのステータスコード、ステータスコードを説明する英語文字列で構成されます。
HTTP1.1 200 OK
レスポンスのデータ( HTML など)を説明する Content-Type や Content-Length などが記述されます。
Data:Tue,01,Dec 2001 23:59:59 GMT # ステータスライン
Content-Type:text/html # レスポンスヘッダー
Content-Length: 47 #
... #
... #
<html>
<body>
<h1>Hello,World!</h1>
</body>
</html>