🔰

API実装で覚えておくべきHTTPステータスコード一覧

に公開

はじめに

実務でHTTPステータスコードを触れる機会が増えてきまして、一度体系的に知識をまとめる狙いで本記事を作成しました。
よく使用される代表的なステータスコードについてまとめています。

主にAPI設計や実装、これからAPIタスク行っていく方々に向けて、HTTPステータスコードの概要を把握してもえれば幸いです🙇‍♀️🙇‍♀️🙇‍♀️

2xx 成功レスポンス

コード 名称 Rails 使用場面
200 OK :ok リクエスト成功(GET, PUT, PATCH) ユーザー情報取得、プロフィール更新
201 Created :created リソース作成成功(POST) ユーザー登録、記事投稿
202 Accepted :accepted リクエスト受付、非同期処理 バッチ処理開始、メール送信依頼
204 No Content :no_content 成功したが返すデータなし(DELETE) ユーザー削除、いいね取り消し

3xx リダイレクト

コード 名称 Rails 使用場面
301 Moved Permanently :moved_permanently 永続的なリダイレクト URL変更、API版数変更
302 Found :found 一時的なリダイレクト ログイン画面への誘導
304 Not Modified :not_modified キャッシュ有効 ETagベースのキャッシュ

4xx クライアントエラー

認証・認可系

コード 名称 Rails 使用場面
401 Unauthorized :unauthorized 認証が必要 ログインしていない、トークン無効
403 Forbidden :forbidden 権限不足 管理者権限が必要、他人のリソースへのアクセス

リクエスト系

コード 名称 Rails 使用場面
400 Bad Request :bad_request リクエストが不正 必須パラメータ未指定、形式エラー
404 Not Found :not_found リソースが存在しない 存在しないユーザーID、削除済みデータ
405 Method Not Allowed :method_not_allowed HTTPメソッドが許可されていない GET専用エンドポイントにPOST
406 Not Acceptable :not_acceptable Acceptヘッダーが不適切 JSON APIにtext/html要求
409 Conflict :conflict リソースの競合 重複登録、同時更新エラー
410 Gone :gone リソースが削除済み 廃止されたAPI、削除されたコンテンツ
412 Precondition Failed :precondition_failed 事前条件エラー If-Match失敗、楽観的ロック
413 Payload Too Large :payload_too_large リクエストサイズ超過 ファイルアップロード制限
415 Unsupported Media Type :unsupported_media_type Content-Type不正 画像APIにテキスト送信
422 Unprocessable Entity :unprocessable_entity バリデーションエラー メールアドレス形式エラー、必須項目未入力
429 Too Many Requests :too_many_requests レート制限超過 API呼び出し回数制限

5xx サーバーエラー

コード 名称 Rails 使用場面
500 Internal Server Error :internal_server_error サーバー内部エラー 予期しない例外、プログラムバグ
501 Not Implemented :not_implemented 機能未実装 将来実装予定の機能
502 Bad Gateway :bad_gateway 上流サーバーエラー 外部API障害
503 Service Unavailable :service_unavailable サービス一時停止 メンテナンス、高負荷
504 Gateway Timeout :gateway_timeout 上流サーバータイムアウト 外部API応答遅延

実装時の判断基準

400 vs 422 の使い分け

  • 400: リクエスト形式が根本的に間違っている

    • 必須パラメータが未指定
    • JSONパース失敗
    • 不正なHTTPメソッド
  • 422: リクエスト形式は正しいが、内容にエラーがある

    • バリデーションエラー
    • ビジネスロジックエラー
    • データベース制約エラー

401 vs 403 の使い分け

  • 401: 認証が必要(ログインしていない)
  • 403: 認証済みだが権限がない

404 vs 410 の使い分け

  • 404: 一般的な「見つからない」
  • 410: 意図的に削除されたリソース

API設計のベストプラクティス

エラーレスポンス統一

{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "入力内容に誤りがあります",
    "details": [
      {
        "field": "email",
        "message": "メールアドレスの形式が正しくありません"
      }
    ]
  }
}

適切なステータスコード選択

  1. まず成功系を考える: 200, 201, 204
  2. 認証・認可をチェック: 401, 403
  3. リクエスト内容を検証: 400, 422
  4. リソースの存在確認: 404, 410
  5. サーバー側の問題: 500, 503

注意点

  • 一貫性を保つ: 同じ種類のエラーには同じステータスコードを使用
  • 適切な粒度: 細かすぎるステータスコードは避ける
  • ドキュメント化: APIドキュメントに各ステータスコードの意味を記載
  • 監視: 4xx/5xxエラーの発生頻度を監視

Rails での実装例

# 成功パターン
render json: data, status: :ok
render json: data, status: :created
head :no_content

# エラーパターン
render json: { error: "Unauthorized" }, status: :unauthorized
render json: { error: "Not found" }, status: :not_found
render json: { errors: @user.errors }, status: :unprocessable_entity

まとめ

ここまでお読みいただきありがとうございます!!
ステータスコードを理解することで、API実装などさまざまな面で役立ちます。

参考URL

HTTP レスポンスステータスコード

Discussion