🔩 ねじき教室 Go と Web の教室

HTTP を生で読む

読了目安 約5分

curl で HTTP/1.1 の開始行とヘッダーを観察し、メソッド、ステータスコード、ヘッダーの読み方を身につける。

30秒でつかむ HTTPの生テキストを、送って読んで確かめる
HTTPの生テキストを、送って読んで確かめるcurlがリクエスト行とヘッダーを送り、サーバーがステータス行と本文を返します。1curlリクエストを送る2HTTPテキストで往復3レスポンス行ごとに読む
  1. curl リクエストを送る
  2. HTTP テキストで往復
  3. レスポンス 行ごとに読む
この章の目次

本編で説明した 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 とセッションで扱います。

試してみよう

  1. curl -v --http1.1 https://example.com/ を実行して、この章で読んだ各行を自分の目で確かめてください。省略した TLS 関連の行やヘッダーも表示されますが、>< の行だけ追えば十分です。
  2. パスをでたらめに変えて(https://example.com/xyz など)、ステータスコードがどう変わるかを見てください。
  3. 普段見ているサイトの 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」で扱っています。