HTTP を生で読む
読了目安 約4分
curl でリクエストとレスポンスの生のテキストを観察し、メソッド、ステータスコード、ヘッダーの読み方を身につける。
この章の目次
本編(/web/01-what-happens/)で説明した HTTP の中身は、ただのテキストです。 実物のリクエストとレスポンスを 1 行ずつ読んでいきます。
curl で会話を観察する
curl は、コマンドラインから HTTP リクエストを送るためのツールです。
WSL の Ubuntu には最初から入っていることが多く、ターミナルで次のように打つと使えます(なければ sudo apt install curl)。
curl -v --http1.1 https://example.com/-v:通信の中身(送ったリクエストと受け取ったレスポンス)を表示します。--http1.1:HTTP のバージョンを 1.1 に固定し、やり取りをそのままテキストとして読めるようにします。
現在は HTTP/2 や HTTP/3 も使われますが、運び方が違うだけで、メソッドやヘッダーといった会話の中身は共通です。
出力のうち、> で始まる行が送ったリクエスト、< で始まる行が受け取ったレスポンスです。
暗号化(TLS)に関する行と一部のヘッダーを省くと、次のようになります(値は環境や時期で変わります)。
> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/8.7.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/html
< Last-Modified: Wed, 15 Jul 2026 18:48:48 GMT
<
<!doctype html>
<html>
(HTML が続く)会話全体の形はリクエストもレスポンスも同じで、「1 行目、ヘッダーの並び、空行、ボディ」という 4 層構造です。
リクエストの構造
リクエストの 1 行目をリクエスト行と呼び、スペース区切りで 3 つの要素が並びます。
- メソッド:
GET。何をしたいかの種別です。 - パス:
/。前章で分解した URL のパス部分です。 - バージョン:
HTTP/1.1。
2 行目からはヘッダー、つまり「名前: 値」の形式で付ける付加情報が続きます。
Host: example.com はどのホスト名宛てのリクエストかを伝えるヘッダーで、User-Agent は「どんなソフトウェアが送ったか」の自己申告です。
ヘッダーの終わりは空行で示します。 空行の後にはボディ(本体のデータ)を置けますが、この例のような GET のリクエストにはボディがないのが普通です。
メソッド
メソッドの中心は 2 つです。
- GET:データの取得。ページを見る、検索するなど、サーバー側の状態を変えない操作に使います。
- POST:データの送信。投稿する、登録するなど、サーバー側の状態を変える操作に使います。
ほかに、更新を表す PUT や削除を表す DELETE などもあります。 ブラウザでリンクをクリックすると GET が、フォームの送信ボタンを押すと多くの場合 POST が送られています。
ステータスコード
HTTP/1.1 200 OK の数字の部分をステータスコードと呼びます。
リクエストがどう処理されたかを表す 3 桁の数字で、先頭の桁で大きく分類されます。
- 1xx:処理の途中。目にする機会は少ないです。
- 2xx:成功。
- 3xx:別の場所を見よ(リダイレクト)。
- 4xx:クライアント側の誤り。
- 5xx:サーバー側の誤り。
代表を 4 つ覚えてください。
- 200 OK:成功。
- 302 Found:別の URL へ移動せよ。移動先は後述の Location ヘッダーに書かれます。
- 404 Not Found:そのパスに対応するものがない。
- 500 Internal Server Error:サーバー内部でエラーが起きた。
Part 3 で自分のサーバーを書くようになると、コードのバグは 500 という形で現れます。
よく見るヘッダー
レスポンス側のヘッダーで、まず知っておくのは次の 3 つです。
- Content-Type:ボディの形式。HTML なら
text/html、JSON ならapplication/jsonです。 - Location:3xx のレスポンスとセットで使われ、移動先の URL を示します。ブラウザはこれを見て自動でその URL に移動します。
- Set-Cookie:サーバーがブラウザに小さなデータを覚えさせるためのヘッダーです。ログイン状態の維持に使われますが、詳細はミニ掲示板でログインを作るとき(/app/04-session/)に扱います。
試してみよう
curl -v --http1.1 https://example.com/を実行して、この章で読んだ各行を自分の目で確かめてください。省略した TLS 関連の行やヘッダーも表示されますが、>と<の行だけ追えば十分です。- パスをでたらめに変えて(
https://example.com/xyzなど)、ステータスコードがどう変わるかを見てください。 - 普段見ているサイトの URL を
http://(s なし)に変えて送ってみてください。多くのサイトは 301 や 302 を返し、Location ヘッダーでhttps://の URL へ誘導してきます。
ボディに入る 2 大形式は、本編の「HTML と JSON」(/web/02-html-json/)で扱っています。