bekkou68 の日記

Gogengo! や IT 技術など。

スマホAPI の Controller 実装でよくつかう HTTPステータスコードの意図別まとめ

はじめに

Railsスマートフォン向けの API をつくっている時にどの HTTPステータスコードを返すか、自分なりの判断基準をまとめてみました。

Controller を実装している時によく返すステータスコードをイメージしています。

200 :ok

  • 以下が正常に行われた場合
    • GET系。action: index, show
    • UPDATE系。action: update
    • DELETE系。action: destroy

201 :created

  • 以下が正常に行われた場合
    • POST系。action: create

400 :bad_request (2015/04/15 更新)

  • 必要なパラメータが存在しない場合
    • 例: 緯度と経度はセットでほしい
  • パラメータが範囲を超えている場合
    • 例: 検索条件のパラメータの範囲がオーバーしている
  • クライアントを普通に使っていれば起こりえないリクエストを受け取ったとき
    • 例: 自分の投稿に返信はできないようにクライアントで制限しているが、リクエストを解析して、自分の投稿に返信するようなデータ不整合を招くリクエストを受け取った

401 :unauthorized

403 :forbidden (2015/08/06 更新)

  • ユーザが退会や BANされている状態で認証を試みた場合

404 :not_found

  • リクエストされたリソースが存在しない場合
  • リクエストされたリソースは存在するがリクエストしたユーザに閲覧権限がなかった場合
    • :unauthorized でもいいが、そもそもリクエストされた URI にリソースがあること自体を伝えたくない場合は :not_found でよい
    • GitHub でも、private リポジトリに閲覧権限なしに URI にアクセスすると :not_found が返ってくる

409 :conflict (2015/08/06 更新)

  • リソースに矛盾がおきそうな場合
    • 一つしか作れないリソースを、すでにあるのにさらに作ろうとした場合
    • ユーザが一意の任意のIDを持てるとして、取得時にすでにそのIDが取得されている場合
    • 削除しようとしたリソースがまだ削除にふさわしくない場合
      • Amazon S3 だとコンテンツを含むバケットを削除しようとすると返る
      • 削除してはいけない状態のリソースを削除しようとする場合

422 :unprocessable_entity

さいごに

だいたいのケースは上記で間に合っている気がしてます。

他にもこういうステータスコード使うよ、このステータスコードはこういうシーンでも使ってるよ、それを表現するにはもっといいステータスコードがあるよ、などありましたら教えてください :)

参考

参考: Restful Webサービス

おまけ: ステータスコードの数字と意味/シンボルの見方

rails console> pp Rack::Utils::HTTP_STATUS_CODES
=> {100=>"Continue",
 101=>"Switching Protocols",
 102=>"Processing",
 200=>"OK",
 201=>"Created",
 202=>"Accepted",
 ...
 511=>"Network Authentication Required"}
rails console> pp Rack::Utils::SYMBOL_TO_STATUS_CODE
=> {:continue=>100,
 :switching_protocols=>101,
 :processing=>102,
 :ok=>200,
 :created=>201,
 :accepted=>202,
 ...
 :network_authentication_required=>511}

コードに数字が書いてあると意味の変換に脳内で時間がかかるので Symbol を使うのが好みです。