1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

HTTPリクエスト・レスポンスの基本とLaravelでの実装方法

Posted at

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
    }
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?