質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.98%

WebApiの「~しているかどうか?」判定を実行した際のエラーコードの分岐

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,591

re-24

score 295

現在WebApiのラッパーライブラリを作成中です。

WebApiで、「すでに~済みの場合は、ステータスコード204を返す」というのがあります。
こういう時、返ってくるステータスコードによりどのような設計にすればいいのかがわからず困っています。

このwebApiでは、返ってくる可能性のあるコードは「200、201、204、400、401、403、404、500」です。

(疑問1)
ステータスコードが200201で返ってきた場合でも、trueを返した方がいい?

(疑問2)
400,500番代は、すべてfalseで返してもいい?
試しに「まだ~していない」場合のパターンを実行してみると404が返却されました。
一律falseを返すと、Httpのエラーでfalseなのか「まだ~していない」からfalseなのかわからなくなりますが、大丈夫でしょうか?

それとも、404だったらfalse、それ以外のエラーだった場合はexceptionにした方がいいのでしょうか?

以上、ご教授お願いします。

[2015/02/14 追記]
CertaiN  さん
回答有難うございます。

ライブラリ利用者が使用する場合のイメージは↓のような感じでしょうか?

$api = new myApi();
// ユーザをフォロー済みかどうかを判定しようとしています。
try {
  if($api->isUserFollow($user_id)) {
    //ユーザをフォロー済みの時の処理
  }
} catch( HttpException $e) {
  // HttpException は自作例外です。

  if($e->getStatusCode() === 404) {
      // ユーザを未フォローの時の処理
  } else {
      // 例外処理
  }
}

上記のように、何かを判定する場合の404はステータスコード上では、確かに不正なリクエストです。
しかし、判定させているApiの場合は正しく不正リクエストしている(?)という感じがしています。(その扱いで、少しモヤモヤしています…)
意図した不正リクエストだから、falseでもいいのかなーと悩んでいます。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

まず一律に、不正なリクエストの場合は「falseを返す」「Exceptionをスローする」のどちらか一方に統一すべきでしょう。特殊な目的が無ければ処理方法に関して一貫性は必要だと思います。

処理フローの提案
Q. レスポンスコードが400未満か? 
    はい: 正常なので結果を返す
    いいえ: レスポンスコードをException生成時の第2引数にセットしてthrowする

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/02/14 16:11

    回答有難うございます。

    一貫して`Exception`にしようかと思います。
    ただ、まだ少し疑問があるので質問に追記させてもらいました。

    再質問となってしまいますが、よろしくおねがいします。

    キャンセル

  • 2015/02/15 11:52

    「意図した不正リクエスト」の意味がよく分からないのですが…
    あるユーザの情報を取得しようとして、そのユーザが存在するかどうかは、(既に自分がそのSNSやユーザについてよく知っていなければ)「リクエストしてみるまで分からない」が正しいのではないでしょうか。

    キャンセル

  • 2015/02/15 13:50

    200番代 → true
    404番 → false
    400番代(404以外) → Exception
    500番代 → Exception
    で悩んでいたのは、

    指定ユーザが存在し、そのユーザをフォローしている:204
    (※) 指定ユーザが存在し、そのユーザをフォローしていない: 404
    指定ユーザが存在しない:404 (このパターンを忘れてた)

    ※このリクエストの場合のみ、falseでわかったほうがいいのかな~と考えていたからです。

    使いたいApiの説明には、フォロー済みだったら204を返すとしか説明がありませんでした。
    でも確かに、フォローしている場合204を返すだけで
    ・ユーザが未登録で404なのか
    ・存在するユーザだけどフォローしていないから404なのか
    リクエストしてみなきゃわからないですね。

    正常の時は、responseを返して、
    400、500番代が発生したら、Exceptionをthrowすることで統一しようかと思います。
    スッキリしました。回答有難うございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる