API通信でサーバー側が400系・500系エラーを判定・検証するPHPコード

APIを提供するサーバー側では、リクエストのバリデーションや内部処理の結果に応じて、適切なHTTPステータスコードを返す必要があります。本記事では、PHPを使用したAPIサーバーの構築例と、400系(クライアントエラー)や500系(サーバーエラー)の判定方法について解説します。


1. 基本的なAPIサーバーの構成

PHPでAPIを作成し、400系・500系のエラーを適切に判定・返すコードの例を紹介します。

基本のAPIコード

phpコピーする編集するheader("Content-Type: application/json");

// リクエストメソッドを取得
$method = $_SERVER['REQUEST_METHOD'];

try {
    if ($method === "GET") {
        handleGetRequest();
    } elseif ($method === "POST") {
        handlePostRequest();
    } else {
        throwError(405, "Method Not Allowed");
    }
} catch (Exception $e) {
    throwError(500, "Internal Server Error: " . $e->getMessage());
}

/**
 * GETリクエストの処理
 */
function handleGetRequest()
{
    $users = [
        ["id" => 1, "name" => "John Doe"],
        ["id" => 2, "name" => "Jane Doe"]
    ];

    response(200, ["status" => "success", "data" => $users]);
}

/**
 * POSTリクエストの処理(バリデーションあり)
 */
function handlePostRequest()
{
    $input = json_decode(file_get_contents("php://input"), true);

    if (!isset($input['name']) || empty($input['name'])) {
        throwError(400, "Invalid request. 'name' is required.");
    }

    response(201, ["status" => "success", "message" => "User created"]);
}

/**
 * 正常なレスポンスを返す
 */
function response($statusCode, $data)
{
    http_response_code($statusCode);
    echo json_encode($data);
    exit;
}

/**
 * エラー時のレスポンスを統一
 */
function throwError($statusCode, $message)
{
    http_response_code($statusCode);
    echo json_encode(["status" => "error", "message" => $message]);
    exit;
}

2. 各エラーハンドリングの詳細

400 Bad Request

phpコピーする編集するif (!isset($input['name']) || empty($input['name'])) {
    throwError(400, "Invalid request. 'name' is required.");
}

主な原因

  • JSONフォーマットが間違っている
  • 必須パラメータが不足している

エラーレスポンス例

jsonコピーする編集する{
    "status": "error",
    "message": "Invalid request. 'name' is required."
}

401 Unauthorized

phpコピーする編集するif (!isset($_SERVER['HTTP_AUTHORIZATION']) || $_SERVER['HTTP_AUTHORIZATION'] !== 'Bearer valid_token') {
    throwError(401, "Unauthorized: Invalid token.");
}

主な原因

  • 認証トークンがない
  • 認証トークンが不正

エラーレスポンス例

jsonコピーする編集する{
    "status": "error",
    "message": "Unauthorized: Invalid token."
}

403 Forbidden

phpコピーする編集するif ($userRole !== "admin") {
    throwError(403, "Forbidden: You do not have permission.");
}

主な原因

  • アクセス権限が不足している

エラーレスポンス例

jsonコピーする編集する{
    "status": "error",
    "message": "Forbidden: You do not have permission."
}

404 Not Found

phpコピーする編集するif ($userId !== 1) {
    throwError(404, "User not found.");
}

主な原因

  • 指定されたリソースが存在しない

エラーレスポンス例

jsonコピーする編集する{
    "status": "error",
    "message": "User not found."
}

405 Method Not Allowed

phpコピーする編集するif ($method !== "GET" && $method !== "POST") {
    throwError(405, "Method Not Allowed");
}

主な原因

  • GET のみ許可されているAPIに POST でリクエストしている

エラーレスポンス例

jsonコピーする編集する{
    "status": "error",
    "message": "Method Not Allowed"
}

3. 500系(サーバーエラー)の処理

500 Internal Server Error

phpコピーする編集するtry {
    throw new Exception("Something went wrong");
} catch (Exception $e) {
    throwError(500, "Internal Server Error: " . $e->getMessage());
}

主な原因

  • プログラムのバグ
  • データベース接続エラー
  • メモリ不足

エラーレスポンス例

jsonコピーする編集する{
    "status": "error",
    "message": "Internal Server Error: Something went wrong"
}

502 Bad Gateway

phpコピーする編集するif (!$backendApiResponse) {
    throwError(502, "Bad Gateway: Backend API not responding.");
}

主な原因

  • リバースプロキシ(Nginx, AWS ALBなど)がバックエンドと通信できない

エラーレスポンス例

jsonコピーする編集する{
    "status": "error",
    "message": "Bad Gateway: Backend API not responding."
}

503 Service Unavailable

phpコピーする編集するif ($serverLoad > 90) {
    throwError(503, "Service Unavailable: Server is overloaded.");
}

主な原因

  • サーバーが過負荷状態

エラーレスポンス例

jsonコピーする編集する{
    "status": "error",
    "message": "Service Unavailable: Server is overloaded."
}

504 Gateway Timeout

phpコピーする編集するif ($apiResponseTime > 30) {
    throwError(504, "Gateway Timeout: API response too slow.");
}

主な原因

  • バックエンドAPIのレスポンスが遅すぎる

エラーレスポンス例

jsonコピーする編集する{
    "status": "error",
    "message": "Gateway Timeout: API response too slow."
}

4. まとめ

ステータスコードエラー内容主な原因
400Bad RequestJSONフォーマットエラー、必須パラメータ不足
401UnauthorizedAPIキー・JWTトークンが無効
403Forbiddenアクセス権限がない
404Not FoundURL間違い、リソースが存在しない
405Method Not AllowedHTTPメソッド間違い
500Internal Server Errorサーバーのバグ、DBエラー
502Bad Gatewayリバースプロキシがバックエンドに接続不可
503Service Unavailableサーバー過負荷
504Gateway TimeoutAPI応答が遅すぎる

PHPで適切に400系・500系のエラーハンドリングを行うことで、APIの信頼性を向上させることができます。
エラーハンドリングの実装を適切に行い、スムーズなAPI運用を目指しましょう。

Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です