HTTP を生で読む
読了目安 約5分
curl で HTTP/1.1 の開始行とヘッダーを観察し、メソッド、ステータスコード、ヘッダーの読み方を身につける。
- curl リクエストを送る
- HTTP テキストで往復
- レスポンス 行ごとに読む
この章の目次
本編で説明した HTTP/1.1 は、開始行とヘッダーをテキストとして読めます。 ボディはテキストとは限らず、画像や圧縮データなどの任意のバイト列を運べます。 この章では、curl が表示するリクエストとレスポンスを 1 行ずつ読んでいきます。
curl で会話を観察する
curl は、コマンドラインから HTTP リクエストを送るためのツールです。
WSL の Ubuntu には最初から入っていることが多く、ターミナルで次のように打つと使えます(なければ sudo apt install curl)。
curl -v --http1.1 https://example.com/-v:通信の中身(送ったリクエストと受け取ったレスポンス)を表示します。--http1.1:HTTP のバージョンを 1.1 に固定し、開始行とヘッダーを HTTP/1.1 の形式で表示させます。
HTTP/2 と HTTP/3 でも、メソッドやステータスコード、ヘッダーの意味は HTTP/1.1 と共通です。 ただし、通信上の表現は同じではありません。 HTTP/2 は TCP 上のバイナリフレームで複数のリクエストを多重化し、HTTP/3 は QUIC 上でストリームとバイナリフレームを使います。
出力のうち、> で始まる行が送ったリクエスト、< で始まる行が受け取ったレスポンスです。
暗号化(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 が続く)HTTP/1.1 のメッセージは、リクエストもレスポンスも「1 行目、ヘッダーの並び、空行、必要に応じてボディ」という構造です。
リクエストの構造
リクエストの 1 行目をリクエスト行と呼び、スペース区切りで 3 つの要素が並びます。
- メソッド:
GET。何をしたいかの種別です。 - パス:
/。前章で分解した URL のパス部分です。 - バージョン:
HTTP/1.1。
2 行目からはヘッダー、つまり「名前: 値」の形式で付ける付加情報が続きます。
Host: example.com はどのホスト名宛てのリクエストかを伝えるヘッダーで、User-Agent は「どんなソフトウェアが送ったか」の自己申告です。
ヘッダーの終わりは空行で示します。 空行の後にはボディ(本体のデータ)を置けます。 ボディはテキストに限らず、Content-Type などのヘッダーがデータの形式を示します。 この例のような 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:サーバーがブラウザに小さなデータを覚えさせるためのヘッダーです。ログイン状態の維持に使われますが、詳細はCookie とセッションで扱います。
試してみよう
curl -v --http1.1 https://example.com/を実行して、この章で読んだ各行を自分の目で確かめてください。省略した TLS 関連の行やヘッダーも表示されますが、>と<の行だけ追えば十分です。- パスをでたらめに変えて(
https://example.com/xyzなど)、ステータスコードがどう変わるかを見てください。 - 普段見ているサイトの URL を
http://(s なし)に変えて送ってみてください。多くのサイトは 301 や 302 を返し、Location ヘッダーでhttps://の URL へ誘導してきます。
答えを見る
2 は、HTTP/1.1 404 Not Found が返ります。
example.com に用意されているのは / だけなので、それ以外のパスは「見つからない」です。
3 の実行例です。
curl -v --http1.1 http://github.com/ を送ると、レスポンスにこの 2 行が含まれます。
< HTTP/1.1 301 Moved Permanently
< Location: https://github.com/うまくいかないとき
curl: (6) Could not resolve host:ホスト名のつづりが違うか、ネットワークにつながっていません。- リクエストとレスポンスの行が表示されない:
-vを付け忘れています。
ボディに入る 2 大形式は、本編の「HTML と JSON」で扱っています。