エラノート エラノート

HTTPとは?リクエストとレスポンスの仕組みを解説

HTTP Web API ステータスコード 入門
広告スペース (article-top)

HTTPは「HyperText Transfer Protocol」の略で、WebブラウザとWebサーバーの間でデータをやり取りするためのルール(プロトコル)です。Webページの閲覧やAPIの呼び出しなど、インターネット上のほぼすべての通信はHTTPを土台としています。この記事では、HTTPの基本的な仕組みを解説します。

HTTPの基本的な仕組み

HTTPは「リクエスト(要求)」と「レスポンス(応答)」の組み合わせで成り立っています。ブラウザがサーバーに「このページをください」とリクエストを送り、サーバーが「はい、どうぞ」とレスポンスを返す、というやり取りです。

身近な例で理解する

HTTPの通信は、レストランでの注文に似ています。

  • お客さん(ブラウザ)がメニューを見て「カレーをください」と注文する → リクエスト
  • 店員(サーバー)が厨房に伝え、料理を持ってくる → レスポンス
  • 「売り切れです」と断られることもある → エラーレスポンス

リクエストとレスポンスの流れ

具体的には、次のような流れでやり取りが行われます。

  1. ブラウザのアドレスバーにURLを入力する
  2. ブラウザがサーバーにHTTPリクエストを送る
  3. サーバーがリクエストを処理する
  4. サーバーがHTTPレスポンスを返す
  5. ブラウザがレスポンスの内容(HTML、画像など)を画面に表示する

この一連のやり取りは通常、数百ミリ秒以内に完了します。

HTTPリクエストの構成

HTTPリクエストは、いくつかの要素で構成されています。ここでは実際のリクエストを見ながら理解しましょう。

リクエストの例

ブラウザが https://example.com/users にアクセスすると、おおよそ次のようなリクエストが送られます。

GET /users HTTP/1.1
Host: example.com
Accept: text/html
User-Agent: Mozilla/5.0 ...

1行目を「リクエストライン」と呼び、メソッド(GET)、パス(/users)、HTTPバージョン(HTTP/1.1)の3つから成ります。2行目以降は「ヘッダー」で、リクエストの付加情報を伝えます。

リクエストヘッダーの役割

ヘッダーには、サーバーに対して「自分はどんなデータを受け取れるか」「どんなブラウザを使っているか」などの情報を伝える役割があります。

  • Host: アクセス先のドメイン名
  • Accept: 受け取りたいデータの形式
  • User-Agent: ブラウザやOSの情報
  • Authorization: 認証に必要なトークンなど
  • Content-Type: 送信するデータの形式

HTTPメソッド

HTTPメソッドは「どんな操作をしたいか」をサーバーに伝えるものです。よく使われるメソッドは4つあります。

GET: データの取得

最も基本的なメソッドです。サーバーからデータを取得するときに使います。ブラウザでWebページを開くときは、内部的にGETリクエストが送られています。

// JavaScriptでGETリクエスト
const response = await fetch("https://api.example.com/users");
const users = await response.json();

POST: データの送信・作成

新しいデータをサーバーに送信して作成するときに使います。会員登録フォームの送信やブログ記事の投稿などが典型的な例です。

// JavaScriptでPOSTリクエスト
const response = await fetch("https://api.example.com/users", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ name: "田中太郎", email: "[email protected]" })
});

PUT / PATCH: データの更新

既存のデータを更新するときに使います。PUTはデータ全体を置き換え、PATCHは一部だけを更新します。

DELETE: データの削除

データを削除するときに使います。

await fetch("https://api.example.com/users/1", {
  method: "DELETE"
});

メソッドの使い分け

これらのメソッドは、データの操作(CRUD)に対応しています。

  • Create(作成)→ POST
  • Read(取得)→ GET
  • Update(更新)→ PUT / PATCH
  • Delete(削除)→ DELETE

HTTPレスポンスの構成

サーバーが返すレスポンスにも、決まった構成があります。

レスポンスの例

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 85

{"name": "田中太郎", "age": 25}

1行目は「ステータスライン」で、HTTPバージョン、ステータスコード(200)、理由フレーズ(OK)が含まれます。ヘッダーの後に空行があり、その下がレスポンスボディ(実際のデータ)です。

レスポンスヘッダーの役割

サーバーからのレスポンスにもヘッダーが付いています。

  • Content-Type: 返すデータの形式(text/htmlapplication/json など)
  • Content-Length: データのサイズ(バイト数)
  • Set-Cookie: ブラウザに保存させたいCookieの情報
  • Cache-Control: キャッシュの制御

ステータスコード

ステータスコードは3桁の数字で、リクエストの処理結果を示します。先頭の数字でカテゴリが分かれています。

2xx: 成功

リクエストが正常に処理されたことを示します。

  • 200 OK: リクエスト成功
  • 201 Created: 新しいリソースが作成された
  • 204 No Content: 成功したが返すデータはない

3xx: リダイレクト

別のURLに転送されることを示します。

  • 301 Moved Permanently: 恒久的にURLが変更された
  • 302 Found: 一時的に別のURLへ転送
  • 304 Not Modified: キャッシュを使ってよい(変更なし)

4xx: クライアントエラー

リクエスト側に問題があることを示します。

  • 400 Bad Request: リクエストの形式が不正
  • 401 Unauthorized: 認証が必要
  • 403 Forbidden: アクセスが禁止されている
  • 404 Not Found: リソースが見つからない

「404エラー」は日常的にも見かけることがあるのではないでしょうか。存在しないURLにアクセスしたときに表示されます。

5xx: サーバーエラー

サーバー側に問題があることを示します。

  • 500 Internal Server Error: サーバー内部でエラーが発生
  • 502 Bad Gateway: 中継サーバーが不正な応答を受け取った
  • 503 Service Unavailable: サーバーが一時的に利用不可

HTTPSとセキュリティ

現在のWebでは、HTTPではなくHTTPSが標準です。URLが https:// で始まるサイトは、HTTPSで通信しています。

HTTPとHTTPSの違い

HTTPSはHTTPにTLS(Transport Layer Security)という暗号化の仕組みを加えたものです。通信内容が暗号化されるため、第三者に盗み見られるリスクが大幅に減ります。

  • HTTP: 通信内容が平文(暗号化なし)
  • HTTPS: 通信内容が暗号化されている

なぜHTTPSが重要なのか

HTTPSが必要な理由は主に次の3つです。

  • パスワードやクレジットカード情報の盗聴を防ぐ
  • 通信内容の改ざんを防ぐ
  • 接続先のサーバーが本物であることを証明する

現在では、ほとんどのブラウザがHTTP接続のサイトに対して警告を表示するようになっています。

開発者ツールでHTTPを観察する

実際のHTTP通信は、ブラウザの開発者ツールで確認できます。

通信内容の確認方法

  1. ブラウザで任意のWebページを開く
  2. 開発者ツールを開く(F12キーまたは右クリック→「検証」)
  3. 「Network」タブを選択する
  4. ページを再読み込みする

一覧に表示される各行が1つのHTTPリクエスト/レスポンスのペアです。クリックすると、ヘッダーやボディの詳細を確認できます。

Pythonでリクエストを試す

Pythonの requests ライブラリを使うと、プログラムからHTTPリクエストを送信できます。

import requests

# GETリクエスト
response = requests.get("https://httpbin.org/get")
print(response.status_code)  # 200
print(response.json())       # レスポンスの中身

# POSTリクエスト
response = requests.post(
    "https://httpbin.org/post",
    json={"name": "田中太郎"}
)
print(response.status_code)  # 200

httpbin.org はHTTPリクエストのテストに使える無料サービスです。送ったリクエストの内容をそのまま返してくれるため、学習に便利です。

まとめ

この記事では、HTTPの基本を解説しました。

  • HTTPはブラウザとサーバー間の通信ルール(プロトコル)
  • リクエスト(要求)とレスポンス(応答)の組み合わせで成り立つ
  • HTTPメソッド(GET、POST、PUT、DELETE)で操作の種類を指定する
  • ステータスコード(200、404、500など)で処理結果を示す
  • HTTPSは暗号化が加わった安全な通信方式

HTTPの仕組みを理解しておくと、API開発やWebアプリケーションの構築がスムーズになります。まずはブラウザの開発者ツールで、ふだん閲覧しているサイトのHTTP通信を観察してみてください。

広告スペース (article-bottom)

あわせて読みたい