📄
概念 📚 fullstack-curriculum 手を動かす STEP 2

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 を個別に観測できる

次に活きる章

URL を打ってから画面が表示されるまで ネットワーク基礎(TCP/IP・DNS・HTTPS)

Web はリクエストとレスポンスの往復で成り立っています。この章では自分の PC から curl でローカルの API を叩き、HTTP の 4 要素(status / header / body / timing)を生で見ていきます。

Web とは(概念)

日常では「インターネットで検索した」と「Web で調べた」がほぼ同じ意味で使われますが、技術的には別レイヤーの概念です。

用語定義具体例
Internet世界中のコンピューターをつなぐネットワークの集合体Web・メール・SSH・オンラインゲームなど
WebInternet 上で HTTP で HTML や JSON をやり取りする仕組みブラウザで開けるサイト、REST API

Web は次の 3 つの技術仕様で成立しています。

  1. URL:リソースの所在を示す文字列(https://example.com/users/42
  2. HTTP:クライアントとサーバーのやり取りの規約
  3. HTML / JSON:ブラウザや API が解釈するデータ形式

通信は必ず クライアントが要求し、サーバーが応答する 一方向です。ブラウザだけがクライアントではありません。curl コマンドも立派な Web クライアントです。本章ではその curl を使って「リクエスト・レスポンス」を手で観測します。

HTTP レスポンスには 4 つの要素があり、それぞれを curl のオプションで取り出せます。

要素意味curl オプション
status200 / 404 / 500 など、処理結果を示す 3 桁コード-w '%{http_code}'
headerContent-Type や Cache-Control などのメタ情報-I / -i
body実際のデータ(HTML・JSON)デフォルト出力
timing応答までの合計時間-w '%{time_total}'

作るもの

curl で /ok を叩き HTTP の 4 要素を観測

  • ローカルで動く lab-api コンテナ(http://localhost:8787)に curl で 5 種類のリクエストを送る
  • レスポンスの status / header / body / timing を 1 つずつ分離して観測する
  • 同じことを公開サイト(https://example.com)に対しても行い、ローカルと公開サーバーの違いを比較する

準備

exercises/ に用意済みの lab-api プロファイルを起動します。

Terminal window
cd exercises
docker compose --profile lab-api up -d --build

起動を確認します。healthy が出れば準備完了です。

Terminal window
docker compose ps
curl -s http://localhost:8787/ok

{"ok":true} のような JSON が返ってくれば成功です。

手順

1. レスポンス全体を見る(-i

-i はヘッダーとボディをまとめて表示します。

Terminal window
curl -i http://localhost:8787/ok

先頭に HTTP/1.1 200 OK、続いて Content-Type: application/json などのヘッダー行、空行のあとに JSON ボディが見えるはずです。この 3 ブロック構造(ステータス行 / ヘッダー / ボディ)が HTTP メッセージの基本 です。

2. status だけ取り出す

運用スクリプトでよく使う書き方です。

Terminal window
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8787/ok

200 と 1 行だけ表示されます。-s はプログレスを黙らせ、-o /dev/null はボディを捨て、-w で指定した変数だけを出します。試しに存在しないパスも叩いてみます。

Terminal window
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8787/notfound
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8787/error

それぞれ 404500 が返ります。status は必ず 3 桁の数字 で、2xx は成功、4xx はクライアントが悪い、5xx はサーバーが悪いと覚えてください。

3. header だけ取り出す(-I

Terminal window
curl -I http://localhost:8787/ok

-IHEAD メソッドを使い、ヘッダーだけ取得します。Content-TypeContent-Length など、サーバーが付けたメタ情報が並びます。ブラウザはこのヘッダーを見て「これは JSON だから JS で扱おう」「HTML だから描画しよう」と判断します。

4. body を整形して見る

Terminal window
curl -s http://localhost:8787/ok | jq

jq は JSON を色付きで整形するツールです(brew install jq / apt install jq)。jq が無ければ curl -s ... だけでも中身は見えます。/posts を叩くと配列が返ってきます。

Terminal window
curl -s http://localhost:8787/posts | jq '.[0]'

body は「API が返すデータそのもの」で、status とは別物であることを意識してください。

5. timing を測る

%{time_total} はリクエストからレスポンス受信完了までの合計時間(秒)です。

Terminal window
curl -s -o /dev/null -w '%{time_total}s\n' http://localhost:8787/ok
curl -s -o /dev/null -w '%{time_total}s\n' 'http://localhost:8787/slow?ms=2000'

/slow?ms=2000 はサーバー側で 2 秒寝るエンドポイントです。2 秒強の値が返ってきます。遅い API を特定するときの基本テクです。

6. 公開サイトに対して同じことをする

ローカルと公開サーバーで同じ 4 要素が観測できることを確認します。

Terminal window
curl -s -o /dev/null -w '%{http_code} %{time_total}s\n' https://example.com
curl -I https://example.com

example.comContent-Type: text/html を返し、ローカルの JSON とは違うことが分かります。サーバーが何を返すかはヘッダーで宣言されている と覚えてください。


手を動かす

やること

  1. docker compose --profile lab-api up -d --build で lab-api を起動する
  2. 上記 1〜5 の curl を順に実行し、4 要素(status / header / body / timing)を自分の目で見る
  3. /notfound(404)と /error(500)も叩いて、status が変わることを確認する
  4. https://example.com に対しても -I-w '%{http_code}' を実行し、ローカル API とヘッダー構造を比べる

成功条件

Terminal window
bash exercises/scripts/verify-b00-1.sh
  • curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8787/ok200 を返す
  • curl -I http://localhost:8787/ok の出力に Content-Type: application/json が含まれる
  • curl -s http://localhost:8787/ok"ok":true を含む JSON を返す
  • verify-b00-1.shAll b00-1 checks passed で終了する

片付け

Terminal window
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 メソッドでリクエストし、サーバーもヘッダーのみ返す仕様だからです。

解説: GETHEAD は同じリソースを対象としますが、HEAD は body を返しません。ファイルサイズや更新時刻を Content-Length / Last-Modified ヘッダーで確認するときに使います。

この章で手を動かすときの確認

この章は 導入編 の STEP 2にある 「手を動かす」 の章です。本文を読み終えたあと、次の観点だけ確認すると次へ進みやすくなります。

この章で確認すること:

  • Web と Internet の違いを説明できる
  • クライアント・サーバーモデルの基礎を理解する
  • curl で status / header / body / timing を個別に観測できる

次に活きる章:

  • URL を打ってから画面が表示されるまで
  • ネットワーク基礎(TCP/IP・DNS・HTTPS)

補助参照: