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 を使うのが好みです。

語源小話: edible から広がる語源の世界

本文

edible は形容詞で「食用の, 食べられる」という意味があります。語源を調べてみるとシンプルで、ラテン語の edere「食べる」+ able「〜できる」です。そのまんまの意味ですね。逆の意味で inedible「【形】食用でない, 食べられない」がありますが、この語源もシンプルです。in「〜でない」+ edible「食べられる」なので否定の意味になります。

あまり聞き慣れないかもしれませんが edacious という「【形】食いしん坊の」を意味する単語があります。これも同じ語源です。edere「食べる」+ ous「〜の性質がある」が合わさり「よく食べる」と派生し、前述の意味が生まれました。文語ですが comestible も edible とほぼ同じ意味です。先頭の com- は「強意」を意味します。

語源を学習していて注意すべきことの一つとして、同じつづりに見えても違う語源から派生する単語があります。たとえば editor です。edible と edi まで一緒なので、もしや食べることに関係している!? と想像できますが、語源を調べると異なります。editor はちょっと複雑に派生しています。ex-「外側へ」+ dit「与える」+ -or「する人」が合わさり「世 (外) に出版する (出す) ために書いたりまとめたりする人」という意味になり「【名】編集者」を意味するようになりました。語源 dit を含むわかりやすい例が donor です。dit「与える」+ -ate「〜する人」が語源なので意味は「【名】ドナー, 臓器提供者」となります。

dit の他の例として面白いのが date です。由来として 2つの説があるようです。1つ目が、ラテン語の手紙の最初に「与えられた」データが「日付」だったという説です。はるか昔のラテン語の手紙の最初には data という項目がありました。data には発信地や日付が書かれました。その data のつづりが変化して date となり、「日付」を意味するようになりました。2つ目が、古アイルランド語の dan (gift) であるという説です。もしかしたら 2つの説は歴史や宗教などで関連があるのかもしれませんが今回はそこまで調べることはできませんでした。2つ目の説の「日々の時間 (date) は与えられたギフトである」という考え方はなんだか素敵ですね。

あわせて知りたい

語源 dit を含む英単語

語源小話とは

一つの単語をピックアップし、語源を解説します。さらにそこから派生し、実は別の単語もつながっていることを説きます。語源の世界の魅力を伝えるための文章です。

語源小話タグをクリックすると過去の文章を見ることができます。

下記メディアで定期的に流しています。こちらもチェックしてみてください。

そのうちまとめて Gogengo! 本体に取り入れようと考えています。

また、厳選した語源小話を iOSアプリ『おもしろ語源』で先行配信しています。そちらも使ってみてください。