Web とは何か
curl で lab-api の /ok を叩き、HTTP レスポンスの 4 要素(status / header / body / timing)を自分の目で観測しながら Web の基本モデルを押さえる
STEP 2
Web の全体像をつかむ
ブラウザ・URL・ネットワークの流れを押さえ、後続章の共通言語を揃える段階。
この STEP でできるようになること
- • Web と Internet の違いを説明できる
- • URL から画面表示までの流れを追える
- • ネットワーク障害の切り分けで使う用語が分かる
この章で手を動かすこと
- • Web と Internet の違いを説明できる
- • クライアント・サーバーモデルの基礎を理解する
- • curl で status / header / body / timing を個別に観測できる
次に活きる章
Web はリクエストとレスポンスの往復で成り立っています。この章では自分の PC から curl でローカルの API を叩き、HTTP の 4 要素(status / header / body / timing)を生で見ていきます。
Web とは(概念)
日常では「インターネットで検索した」と「Web で調べた」がほぼ同じ意味で使われますが、技術的には別レイヤーの概念です。
| 用語 | 定義 | 具体例 |
|---|---|---|
| Internet | 世界中のコンピューターをつなぐネットワークの集合体 | Web・メール・SSH・オンラインゲームなど |
| Web | Internet 上で HTTP で HTML や JSON をやり取りする仕組み | ブラウザで開けるサイト、REST API |
Web は次の 3 つの技術仕様で成立しています。
- URL:リソースの所在を示す文字列(
https://example.com/users/42) - HTTP:クライアントとサーバーのやり取りの規約
- HTML / JSON:ブラウザや API が解釈するデータ形式
通信は必ず クライアントが要求し、サーバーが応答する 一方向です。ブラウザだけがクライアントではありません。curl コマンドも立派な Web クライアントです。本章ではその curl を使って「リクエスト・レスポンス」を手で観測します。
HTTP レスポンスには 4 つの要素があり、それぞれを curl のオプションで取り出せます。
| 要素 | 意味 | curl オプション |
|---|---|---|
| status | 200 / 404 / 500 など、処理結果を示す 3 桁コード | -w '%{http_code}' |
| header | Content-Type や Cache-Control などのメタ情報 | -I / -i |
| body | 実際のデータ(HTML・JSON) | デフォルト出力 |
| timing | 応答までの合計時間 | -w '%{time_total}' |
作るもの
- ローカルで動く
lab-apiコンテナ(http://localhost:8787)に curl で 5 種類のリクエストを送る - レスポンスの status / header / body / timing を 1 つずつ分離して観測する
- 同じことを公開サイト(
https://example.com)に対しても行い、ローカルと公開サーバーの違いを比較する
準備
exercises/ に用意済みの lab-api プロファイルを起動します。
cd exercisesdocker compose --profile lab-api up -d --build起動を確認します。healthy が出れば準備完了です。
docker compose pscurl -s http://localhost:8787/ok{"ok":true} のような JSON が返ってくれば成功です。
手順
1. レスポンス全体を見る(-i)
-i はヘッダーとボディをまとめて表示します。
curl -i http://localhost:8787/ok先頭に HTTP/1.1 200 OK、続いて Content-Type: application/json などのヘッダー行、空行のあとに JSON ボディが見えるはずです。この 3 ブロック構造(ステータス行 / ヘッダー / ボディ)が HTTP メッセージの基本 です。
2. status だけ取り出す
運用スクリプトでよく使う書き方です。
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8787/ok200 と 1 行だけ表示されます。-s はプログレスを黙らせ、-o /dev/null はボディを捨て、-w で指定した変数だけを出します。試しに存在しないパスも叩いてみます。
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8787/notfoundcurl -s -o /dev/null -w '%{http_code}\n' http://localhost:8787/errorそれぞれ 404 と 500 が返ります。status は必ず 3 桁の数字 で、2xx は成功、4xx はクライアントが悪い、5xx はサーバーが悪いと覚えてください。
3. header だけ取り出す(-I)
curl -I http://localhost:8787/ok-I は HEAD メソッドを使い、ヘッダーだけ取得します。Content-Type や Content-Length など、サーバーが付けたメタ情報が並びます。ブラウザはこのヘッダーを見て「これは JSON だから JS で扱おう」「HTML だから描画しよう」と判断します。
4. body を整形して見る
curl -s http://localhost:8787/ok | jqjq は JSON を色付きで整形するツールです(brew install jq / apt install jq)。jq が無ければ curl -s ... だけでも中身は見えます。/posts を叩くと配列が返ってきます。
curl -s http://localhost:8787/posts | jq '.[0]'body は「API が返すデータそのもの」で、status とは別物であることを意識してください。
5. timing を測る
%{time_total} はリクエストからレスポンス受信完了までの合計時間(秒)です。
curl -s -o /dev/null -w '%{time_total}s\n' http://localhost:8787/okcurl -s -o /dev/null -w '%{time_total}s\n' 'http://localhost:8787/slow?ms=2000'/slow?ms=2000 はサーバー側で 2 秒寝るエンドポイントです。2 秒強の値が返ってきます。遅い API を特定するときの基本テクです。
6. 公開サイトに対して同じことをする
ローカルと公開サーバーで同じ 4 要素が観測できることを確認します。
curl -s -o /dev/null -w '%{http_code} %{time_total}s\n' https://example.comcurl -I https://example.comexample.com は Content-Type: text/html を返し、ローカルの JSON とは違うことが分かります。サーバーが何を返すかはヘッダーで宣言されている と覚えてください。
手を動かす
やること
docker compose --profile lab-api up -d --buildで lab-api を起動する- 上記 1〜5 の curl を順に実行し、4 要素(status / header / body / timing)を自分の目で見る
/notfound(404)と/error(500)も叩いて、status が変わることを確認するhttps://example.comに対しても-Iと-w '%{http_code}'を実行し、ローカル API とヘッダー構造を比べる
成功条件
bash exercises/scripts/verify-b00-1.sh-
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8787/okが200を返す -
curl -I http://localhost:8787/okの出力にContent-Type: application/jsonが含まれる -
curl -s http://localhost:8787/okが"ok":trueを含む JSON を返す -
verify-b00-1.shがAll b00-1 checks passedで終了する
片付け
docker compose down確認クイズ
Q1. `curl -s -o /dev/null -w '%{http_code}\n' URL` で `200` と表示される一方、body は画面に出ませんでした。なぜですか。
正解: -o /dev/null でボディをファイル(null デバイス)に捨てているため、画面には -w で指定した http_code だけが残ります。
解説: status だけが欲しい監視スクリプトではこの形が定番です。body が長い API でもターミナルを汚さずに済みます。
Q2. `curl -I http://localhost:8787/ok` でヘッダーは出るのに、body は表示されません。なぜですか。
正解: -I は HTTP HEAD メソッドでリクエストし、サーバーもヘッダーのみ返す仕様だからです。
解説: GET と HEAD は同じリソースを対象としますが、HEAD は body を返しません。ファイルサイズや更新時刻を Content-Length / Last-Modified ヘッダーで確認するときに使います。
この章で手を動かすときの確認
この章は 導入編 の STEP 2にある 「手を動かす」 の章です。本文を読み終えたあと、次の観点だけ確認すると次へ進みやすくなります。
この章で確認すること:
- Web と Internet の違いを説明できる
- クライアント・サーバーモデルの基礎を理解する
- curl で status / header / body / timing を個別に観測できる
次に活きる章:
- URL を打ってから画面が表示されるまで
- ネットワーク基礎(TCP/IP・DNS・HTTPS)
補助参照: