HTTPリクエストの構造
# 1.リクエストライン
POST /api/users HTTP/1.1
# 2.ヘッダー情報
Host: api.example.com
Content-Type: application/json
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: application/json
# 3.ボディ
{
"name": "田中太郎",
"email": "tanaka@example.com"
}
1.リクエストライン
リクエストラインは、HTTPリクエストの最初の行で、リクエストの基本情報を表します。
POST /api/users HTTP/1.1
HTTPメソッド + URI + HTTPバージョン
という構成になります。
2.ヘッダー情報
ヘッダーとはHTTPリクエストの2行目以降で、リクエストの詳細な制御情報を指定します。
# 2.ヘッダー情報
Host: api.example.com
Content-Type: application/json
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: application/json
Host
Host: api.example.com
リクエスト送信先のホスト名を指定します。
Content-Type
Content-Type: application/json
リクエストで送信するボディの形式を指定します。
-
例:
application/json
,text/html
,multipart/form-data
User-Agent
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
送信元のクライアント(ブラウザ)の情報、送信先のサーバーが適切な情報をレスポンスするために使用します。
Accept
Accept: application/json
送信元のクライアントが受け取ることができるレスポンスボディのMIMEタイプ形式を記載します。
例
-
application/json
- Json形式
-
text/html
- HTMLファイル
-
*/*
- どんなファイルでもOK
3.ボディ
{
"name": "田中太郎",
"email": "tanaka@example.com"
}
リクエストボディには、サーバーに送信するデータを記載します。
HTTPレスポンスの構造
先ほどのPOSTリクエストに対するレスポンス:
# 1. ステータスライン
HTTP/1.1 201 Created
# 2.レスポンスヘッダー
Content-Type: application/json
Content-Length: 89
Server: nginx/1.18.0
Date: Mon, 15 Jan 2024 10:30:00 GMT
# 3.レスポンスボディ
{
"id": 1,
"name": "田中太郎",
"email": "tanaka@example.com",
"created_at": "2024-01-15T10:30:00Z"
}
レスポンスの構造
HTTPレスポンスは以下の3つの部分で構成されています:
1. ステータスライン
HTTP/1.1 201 Created
ステータスラインは、HTTPレスポンスの最初の行で、レスポンスの基本情報を表します。
HTTPバージョン + ステータスコード + ステータスメッセージ
という構成になります。
ステータスコード主要なカテゴリ
分類 | 意味 | 例 |
---|---|---|
1xx | 情報系 | リクエストの継続 |
2xx | 成功系 | ユーザー一覧の取得、新規作成 |
3xx | リダイレクト系 | サイトの移転、ログイン後のリダイレクト |
4xx | クライアントエラー系 | リクエストエラー、認証エラー、見つからない |
5xx | サーバーエラー系 | サーバーエラー、メンテナンス中 |
よく使用するステータスコード一覧
コード | メッセージ | 用途 | 例 |
---|---|---|---|
200 | OK | リクエストが正常に処理された | ユーザー一覧の取得 |
301 | Moved Permanently | リソースが永続的に移動した | サイトの移転 |
302 | Found | リソースが一時的に移動した | ログイン後のリダイレクト |
400 | Bad Request | リクエストが不正 | 必須パラメータの不足 |
401 | Unauthorized | 認証が必要 | ログインしていない状態でのAPIアクセス |
403 | Forbidden | アクセスが拒否された | 権限不足 |
404 | Not Found | リソースが見つからない | 存在しないユーザーID |
500 | Internal Server Error | サーバー内部エラー | プログラムエラー |
502 | Bad Gateway | ゲートウェイエラー | プロキシサーバーのエラー |
503 | Service Unavailable | サービスが利用できない | メンテナンス中 |
2.レスポンスヘッダー
Content-Type: application/json
Content-Length: 89
Server: nginx/1.18.0
Date: Mon, 15 Jan 2024 10:30:00 GMT
レスポンスヘッダーは、HTTPレスポンスの2行目以降で、レスポンスの詳細な制御情報を指定します。
Content-Type
Content-Type: application/json
- 役割: レスポンスボディの形式を指定
-
例:
application/json
,text/html
,image/png
Content-Length
Content-Length: 89
- 役割: レスポンスボディのサイズ(バイト数)
Server
Server: nginx/1.18.0
- 役割: レスポンス元のサーバー情報
-
例:
nginx/1.18.0
,Apache/2.4.41
,Laravel/10.0
Date
Date: Mon, 15 Jan 2024 10:30:00 GMT
- 役割: レスポンスの日時
- 用途: キャッシュの制御、ログの記録
3.レスポンスボディ
{
"id": 1,
"name": "田中太郎",
"email": "tanaka@example.com",
"created_at": "2024-01-15T10:30:00Z"
}
レスポンスボディには、サーバーからクライアントに返す実際のデータが含まれます。
Content-Typeヘッダーで指定された形式のものがレスポンスされます。
今回の例ではJsonですがhtmlやjpgの場合もあります。
Laravelのリクエスト・レスポンス
先ほどの例をLaravelで実装してみたいと思います!
リクエストを送信する側(クライアント)
class UserController extends Controller
{
public function createUser(Request $request)
{
// POSTリクエストを送信しレスポンスを変数に格納
$response = Http::withHeaders([
'Content-Type' => 'application/json',
'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'Accept' => 'application/json'
])->post('https://api.example.com/api/users', [
'name' => '田中太郎',
'email' => 'tanaka@example.com'
]);
// レスポンスの処理
if ($response->status() === 201) {
$user = $response->json();
return response()->json([
'message' => 'ユーザー作成成功',
'user' => $user
]);
} else {
return response()->json([
'error' => 'ユーザー作成に失敗しました',
'status' => $response->status()
], 400);
}
}
}
リクエストを受け取る側(サーバー)
class ApiUserController extends Controller
{
public function store(Request $request): JsonResponse
{
// バリデーション
$validated = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users,email'
]);
// ユーザー作成
$user = User::create([
'name' => $validated['name'],
'email' => $validated['email']
]);
// サンプルと同じレスポンス形式
return response()->json([
'id' => $user->id,
'name' => $user->name,
'email' => $user->email,
'created_at' => $user->created_at->toISOString()
], 201); // 201 Created
}
}