HTTPの基本|リクエストとレスポンスの仕組みを理解する
HTTPを理解すると、ブラウザがページを表示する流れも、APIがデータを返す流れも同じ土台で見えるようになります。
実務では、Webページの表示不具合を調べるとき、API連携で 400 や 500 の原因を追うとき、フォーム送信やファイルアップロードの挙動を確認するときにHTTPの知識がそのまま役立ちます。
- HTTPは、クライアントが送るリクエストと、サーバーが返すレスポンスで成り立つ
- まず見るべきは
メソッドURLヘッダーボディステータスコード - 例はHTTP/1.1の文字ベースで示すが、HTTP/2やHTTP/3でも意味の中心は同じ
ここがポイント: HTTPは「何をほしいかを伝える依頼」と「その結果を返す返事」の約束事です。仕組みを分解して見ると、ブラウザ通信もAPI通信も読みやすくなります。
HTTPで何ができるのか
HTTPは、Webブラウザとサーバーの会話だけの話ではありません。現在はAPI、モバイルアプリ、社内ツール、外部サービス連携でも広く使われています。
たとえば次のような場面です。
- ブラウザがHTML、CSS、画像を取得する
- フォームからユーザー情報を送信する
- JavaScriptがAPIからJSONを取得する
- 社内バッチが外部APIへデータを登録する
- 監視ツールがステータス確認用エンドポイントを叩く
HTTPは「どの資源に対して」「何をしたいか」を伝える共通ルールなので、画面表示でもシステム連携でも同じ考え方で追えます。
前提として押さえたい構成
ここでは、MDNとHTTP標準仕様に沿って、HTTP/1.1の読みやすい形で説明します。メッセージの意味はHTTP/2やHTTP/3でも共通です。
HTTP通信の基本構成は次の2つです。
リクエスト
クライアントがサーバーに送る依頼です。
GET /products/123 HTTP/1.1
Host: example.com
Accept: application/json
この短い通信でも、最低限の情報が入っています。
GET: 何をしたいか。今回はデータ取得/products/123: どの資源を対象にするかHTTP/1.1: どのHTTP形式で通信するかHost: どのホスト宛てかAccept: どんな形式の返答を受け取りたいか
レスポンス
サーバーが返す結果です。
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 45
{"id":123,"name":"Keyboard","price":4980}
見るべきポイントは次の通りです。
200 OK: 処理結果。成功か失敗かを示すContent-Type: 中身の種類。JSONなのかHTMLなのかContent-Length: 本文サイズ- 本文: 実際に返ってきたデータ
リクエストはどう組み立てられるか
HTTPリクエストは、実務で見るときに4つへ分けると理解しやすくなります。
1. メソッド
メソッドは、サーバーに何をしてほしいかを示します。
GET: データ取得POST: 新規作成や送信PUT: 全体更新PATCH: 一部更新DELETE: 削除HEAD: 本文なしで情報だけ確認OPTIONS: 使える通信方法を確認
初心者がまず押さえるなら、GET と POST を区別できればかなり前に進めます。
GET: 一覧表示、詳細表示、検索結果取得POST: ログイン送信、問い合わせ送信、APIへの登録
2. URL
URLは「どこに依頼するか」です。
https://api.example.com/users/42?expand=profile
このURLなら、見るポイントは次の通りです。
https: 通信方式。通常は暗号化されたHTTPSを使うapi.example.com: 接続先ホスト/users/42: 対象リソース?expand=profile: 追加条件を表すクエリ文字列
実務では、同じメソッドでもURLが違えば意味が変わることが多いです。
GET /users: ユーザー一覧GET /users/42: ユーザー詳細
3. ヘッダー
ヘッダーは本文そのものではなく、通信に関する付加情報です。
よく使うものは次の通りです。
Host: 接続先ホスト名Accept: 受け取りたいデータ形式Content-Type: 送る本文の形式Authorization: 認証情報User-Agent: クライアント情報Cookie: セッション情報
たとえばAPIへJSONを送るときは Content-Type: application/json が重要です。これがずれると、本文が正しくてもサーバー側で解釈に失敗することがあります。
4. ボディ
ボディは、サーバーへ渡す実データです。主に POST PUT PATCH で使います。
POST /users HTTP/1.1
Host: api.example.com
Content-Type: application/json
{"name":"Sato","email":"sato@example.com"}
この本文はJSONです。フォーム送信なら application/x-www-form-urlencoded、ファイルアップロードなら multipart/form-data が使われることもあります。
レスポンスはどう読めばよいか
レスポンスは「成功したか」だけでなく、何が返ってきたかまで見る必要があります。
1. ステータスコード
最初に見るべき値です。
1xx: 処理途中2xx: 成功3xx: 転送や再取得が必要4xx: リクエスト側の問題5xx: サーバー側の問題
実務でよく出るものを絞ると、次の把握で十分です。
200 OK: 正常に取得できた201 Created: 新規作成できた204 No Content: 成功したが返す本文はない301302: 別の場所へ移動400 Bad Request: 送信内容が不正401 Unauthorized: 認証が必要、または認証失敗403 Forbidden: 権限不足404 Not Found: 対象が見つからない500 Internal Server Error: サーバー内部エラー503 Service Unavailable: 一時的に利用不可
同じ失敗でも意味はかなり違います。たとえば 404 はURLやIDの誤りを疑い、500 はサーバー処理やアプリのログ確認に進むべきです。
2. レスポンスヘッダー
レスポンスヘッダーは、本文の読み方や次の動作を決める材料です。
よく見るものは次の通りです。
Content-Type: HTMLかJSONか画像かContent-Length: 本文サイズLocation: リダイレクト先や作成済みリソースの場所Cache-Control: キャッシュ方針Set-Cookie: Cookieの保存指示
APIデバッグでは、本文だけ見ていると原因を取りこぼします。たとえば 201 Created のレスポンスで Location が返っていれば、新しく作られたリソースのURLを次の処理で使えます。
3. レスポンスボディ
レスポンスボディには、取得結果やエラー内容が入ります。
{
"error": "invalid_parameter",
"message": "email is required"
}
このようなエラー本文があれば、単に「失敗した」で終わらず、どの入力が問題かまで追えます。HTTPはステータスコードと本文を合わせて読むのが基本です。
実務で多い流れを1本で見る
理屈だけだとつかみにくいので、ユーザー作成APIの流れで見てみます。
リクエスト例
POST /api/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Accept: application/json
Authorization: Bearer <token>
{
"name": "Yamada",
"email": "yamada@example.com"
}
レスポンス例
HTTP/1.1 201 Created
Content-Type: application/json
Location: https://api.example.com/api/users/501
{
"id": 501,
"name": "Yamada",
"email": "yamada@example.com"
}
このやり取りで読めることは明確です。
POSTなので新規作成の依頼- JSONを送るので
Content-Type: application/json Authorizationがあるので認証付きAPI201 Createdなので作成成功Locationがあるので作成済みリソースのURLも分かる- 本文に作成結果が入っているので、画面表示や後続処理に使える
HTTPの理解が浅いと「APIが動いたかどうか」だけ見がちですが、実務ではどのヘッダーが必要か、返答のどこを次の処理で使うかまで読むことが重要です。
ブラウザとAPIで見え方はどう違うか
HTTPの土台は同じでも、ブラウザ表示とAPI連携では注目点が少し変わります。
ブラウザでよく見るもの
- HTML取得の
GET - CSS、JavaScript、画像の追加リクエスト
302などのリダイレクトSet-Cookieによるログイン維持- キャッシュ関連ヘッダー
APIでよく見るもの
Content-Type: application/jsonAuthorizationヘッダーPOSTPUTPATCHDELETE400401403422などの入力・認証エラー- JSON本文に含まれるエラーメッセージ
この違いを意識すると、ブラウザの開発者ツールやAPIテストツールで何を見るべきかが早く決まります。
よくある失敗と見直しポイント
HTTPでつまずく原因は、派手な理論より基本項目の見落としであることが多いです。
400 Bad Request が出る
よくある原因です。
- JSONの構文が壊れている
- 必須パラメータが不足している
Content-Typeが実データ形式と合っていない- URLのクエリ指定が誤っている
まずは本文、ヘッダー、API仕様の3点を並べて確認します。
401 と 403 を混同する
似ていますが意味は別です。
401: 認証情報がない、または無効403: 認証は通っているが権限が足りない
ここを取り違えると、トークン再発行が必要なのか、権限設定の見直しが必要なのかがずれます。
GET にボディを送れば何でも動くと思う
HTTPの仕様や実装では、メソッドごとに期待される使い方があります。データ取得、作成、更新、削除をメソッドで分ける前提で多くのAPIやツールが作られているため、仕様書どおりのメソッドを使うのが基本です。
本文だけ見てヘッダーを見ない
実務ではこれがかなり多いです。
- JSONのつもりで見たら実際はHTMLエラーページだった
- 文字化けの原因が
Content-Typeだった - リダイレクトで別URLへ飛ばされていた
- キャッシュにより古いデータを見ていた
NetworkタブやAPIテストツールでは、本文だけでなくヘッダーも必ず確認した方が早く原因に届きます。
HTTPを確認する代表的な方法
理解を定着させるには、実際に通信を観察するのが近道です。
- ブラウザの開発者ツール
Networkタブ curlでのAPIリクエスト確認- PostmanなどのAPIテストツール
- サーバーログやアプリケーションログの突き合わせ
特に初心者には、ブラウザの Network タブで1本のリクエストを開き、次の順で見る方法がおすすめです。
- URL
- メソッド
- ステータスコード
- リクエストヘッダー
- リクエスト本文
- レスポンスヘッダー
- レスポンス本文
この順番で見る癖がつくと、APIでもWeb画面でも同じ見方ができます。
HTTP/1.1とHTTP/2とHTTP/3の違いはどこまで気にするべきか
入門段階では、まず意味を理解することが先です。
MDNでも、HTTP/2ではメッセージがバイナリフレーム化される一方で、基礎となる意味はHTTP/1.xの理解から学べると整理されています。つまり、メソッド、ヘッダー、ステータスコード、ボディの役割をHTTP/1.1形式で理解しておけば、実務の入り口としては十分です。
細かい違いとしては次の程度を知っておけば足ります。
- HTTP/1.1: 文字ベースで読みやすい
- HTTP/2: 高速化のための多重化やバイナリ化がある
- HTTP/3: QUICを使い、接続面の改善がある
ただし、API仕様書を読む、エラーを切り分ける、ブラウザ通信を追う、といった日常業務では、まずリクエストとレスポンスの意味を正確に読む力が効きます。
関連ツールと使い分け
HTTPを学ぶときは、用途に応じて道具を分けると効率が上がります。
- ブラウザの通信確認: 開発者ツール
- API疎通確認:
curl - 繰り返しテスト: Postman
- 自動処理への組み込み: Python、Node.js、ShellなどのHTTPクライアント
学習順としては、まずブラウザで見える通信を観察し、その後で curl やコードから同じHTTPを再現すると理解が深まります。
まとめ
HTTPの基本は難しくありません。見るべき場所を固定すれば、通信の意味が読み取れるようになります。
- リクエストは「何を、どこへ、どう送りたいか」
- レスポンスは「結果がどうなり、何が返ったか」
- 最初に見るべきは
メソッドURLヘッダーボディステータスコード - エラー調査では、本文だけでなくヘッダーまで見る
次に学ぶなら、ブラウザの Network タブで実際の通信を1本開き、この記事の観点で分解してみるのが最短です。HTTPは知識として覚えるより、1件の通信を正しく読む練習のほうが実務に直結します。
