メインコンテンツへスキップ
  1. 第10講 Webアプリケーション(Docker)/

HTTP

HTTP ステータスコード リクエスト レスポンス
目次

HTTP
#

HTTP (Hyper Text Transfer Protocol) は,Web サーバと Web クライアントの間でデータを送受信するためのプロトコル(決まりごと)です. 基本的には状態を持たず,1つのリクエストにつき,1つのレスポンスが返されるという特徴があります. リクエストとレスポンスの構造は次の通りです.

HTTP リクエストの構造(クリックで更新)
HTTP レスポンスの構造(クリックで更新)

リクエストもレスポンスも,ヘッダとボディに分けられ,ヘッダとボディは空行で区切られます. リクエストのヘッダは,1行目にHTTPのメソッド,リソースのパス,HTTPのバージョンが記述されます. そして,2行目以降にリクエストヘッダが続きます.

レスポンスのヘッダは,1行目にHTTPのバージョン,ステータスコードが記述されます. そして,2行目以降にレスポンスヘッダが続きます. レスポンスのボディには,リクエストしたリソースのデータ(HTMLや画像など)が含まれます.

HTTP メソッド
#

HTTP メソッドは,リクエストの目的を示すためのものです. リクエストの1行目に記述されるメソッドによって,リソースに対する操作が決まります. 代表的なメソッドは次の通りです.

  • GET:リソースの取得
  • POST:リソースの作成
  • PUT:リソースの更新
  • DELETE:リソースの削除

ブラウザでHTMLページを表示するときは GET メソッドが使われます. <form>を使ってデータを送信するときは POST メソッドが使われることが多いです.

HTTP のステータスコード
#

HTTP のステータスコードは,リクエストの結果を示すためのものです. ステータスコードは,3桁の数字で表され,次のような意味があります.

  • 1xx:情報
    • 100:リクエストを受け付けた.
  • 2xx:成功
    • 200:リクエストが成功した (OK)
    • 201:リソースが作成された (Created)
  • 3xx:リダイレクト
    • 301:リソースが移動した (Moved Permanently)
  • 4xx:クライアントエラー
    • 400:不正なリクエストであった (Bad Request)
    • 404:リソースが見つからない (Not Found)
  • 5xx:サーバエラー
    • 500:サーバ内部エラー (Internal Server Error)

適切なステータスコードを返すことで,クライアントにリクエストの結果を伝えることができます.

HTTP リクエストの例
#

curlコマンドは,コマンドラインから HTTP リクエストを送信するためのコマンドです. -i オプションを付けると,レスポンスヘッダが表示されるようになります.

example.com
#

次の例は,curlコマンドを使って,http://example.comGET リクエストを送信する例(curl -i http://example.comの実行結果)です.

HTTP/1.1 200 OK                              # ステータスコード.200 だから成功した.
Accept-Ranges: bytes                         # 以降レスポンスヘッダ.ヘッダの順序に意味はない.
Age: 510491
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8       # レスポンスボディがどのような形式で記載されているか.
Date: Sat, 02 Nov 2024 00:48:47 GMT          # レスポンスが返された日時
Etag: "3147526947"
Expires: Sat, 09 Nov 2024 00:48:47 GMT       
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECAcc (lac/558F)
Vary: Accept-Encoding
Content-Length: 1256                         # レスポンスボディの長さ.
X-Cache: HIT                                 # 続いて空行があるので,これでヘッダは終わり.

<!doctype html>
... 以降省略

google.co.jp
#

次の例は,curlコマンドを使って,https://google.co.jpGET リクエストを送信する例(curl -v https://google.co.jpの実行結果)です. -v オプション(verbose; 冗長な)を付けるとリクエストヘッダも表示されるようになります.

* Host google.co.jp:443 was resolved.   # * から始まる行は,curl が出力する情報.
* IPv6: (none)
* IPv4: 142.251.42.163
# ... 途中省略
> GET / HTTP/2                          # > から始まる行は,リクエストを表す.
> Host: google.co.jp
> User-Agent: curl/8.7.1
> Accept: */*
>
* Request completely sent off           # < から始まる行は,レスポンスヘッダを表す.
< HTTP/2 301                            # 301 は恒久的に移動したことを示すステータスコード.
< location: https://www.google.co.jp/   # 移動先のURL.ブラウザでアクセスした場合,ブラウザは,このURLに対して,もう一度リクエストを送る.
< content-type: text/html; charset=UTF-8
# ... 途中省略
< alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
<
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://www.google.co.jp/">here</A>.
</BODY></HTML>
* Connection #0 to host google.co.jp left intact