「お住まいの地域ではサービスを利用できません」というエラーのHTTPステータスコードは何ですか?


51

現在、5つの都市でサービスを提供しています。誰かが他の都市からサービスAPIを呼び出そうとした場合、このエラーをスローしますService not available in your area

問題は、このエラーに適切なhttpコードは何ですか?

  • 503:サービスを利用できません
  • 403禁止します

または、他の何か?


52
「誰かが私たちのサービスAPIを他の都市から呼び出そうとした場合」、IPジオロケーションは非常にしばしば間違っていることに注意してください。
ピーターグリーン

43
別の都市にいて、私を訪問するために空港に来る必要がある私の子供のために乗車を許可することはできませんか?
ダウードはモニカ回復言う

29
質問への答えではありませんが、HTTP 451(RFC 7725)は、この質問を見つけた将来の読者にとって役立つかもしれません。主な目的は、法的要求、アクション、または制限のためにコンテンツが利用できないことを示すことです(著作権、裁判所命令など)
Tyzoid

34
ネットワーク接続、認証、アプリケーションの内部エラー、構文的に有効な入力に何も問題がない場合、エラーメッセージは表示されません。「この分野ではサービスを提供していません」では、技術的な問題を残し、ビジネス上の問題を抱えているため、HTTPエラーが適切かどうかはわかりません。200と(または302とリダイレクト)に、「お住まいの地域ではまだサービスをご利用いただけません。申し訳ありませんが、拡大しています-2019年後半にチェックしてください!」またはマーケティング部が思いつくものは何でも。
ivanivan

7
クライアントコンピューターの場所に基づいてAPIへのすべてのアクセスをブロックするか(geo IP?)、または特定の失敗したAPIリクエストの応答コードを要求するか(book?address = 123_example_st_londonなど) 。ロケーションは入力の一部ですか、それとも他の方法でクライアントのロケーションを持っていますか?
ベン

回答:


101

HTTPエラーコードは不適切です。HTTPの観点から見れば、エラーや問題はありません。200の範囲内にあるはずです。ユーザーにサービスを提供しないことを伝えるドキュメントを送り返すことで、ユーザーにサービスを提供しないことを丁寧に伝えます。そして、これはすべてうまくいきます。

ユーザーはアプリケーションを使用できません。それは、ビジネスロジックによって行われる意識的な決定であり、事故ではありません。HTTPレベルでは、すべてがひどいものです。

編集

私たちがここで見ているのは、古い学校と新しい学校の衝突のようです。HTTPが設計されたとき、Webサービス、SOAP、JSON、RESTの原則はありませんでした。TCPを超えるプロトコルとして、これはすでにアプリケーションレベル(近く)であると見なされており、多くの高レベルのステータスコードが定義されていました。Webがよりリッチで高レベルのサービスに使用されるようになり、「エンベロープ」を転送する一般的な手段が必要になったとき、HTTPが遍在しているという理由だけで、デザイナーはより新しいクリーンなプロトコルを定義するのではなく、HTTPをハイジャックしました。

そのため、最新のWebサービスのコンテキストでは、HTTPは実際には単なるトランスポートレイヤーに過ぎず、そのコードのほとんどは適用されないか時代遅れであると見なされる場合があります。アプリケーションの状態に近づき、かつては何かが無害に見えるかもしれないことを意味するリストにたまたま入っているので、1つを選ぶだけですが、間違ったメッセージを送信すると思います。WebサービスのコンテキストでHTTPがその規制の役割を果たすことは望ましくありません。


56
このロジックにより、すべてのアプリケーションエラーは200として返されます。また、すべてのリクエストは、削除であってもPOSTである必要があります。このアプローチは、HTTPをTCPのような不透明なトランスポートプロトコルとして扱います。これは、WebサービスAPIの通常の処理方法ではありません。APIの標準言語であるHTTPセマンティクスを活用しようとします。カスタムの非標準エラーコードで200を返すのではなく、Unauthorizedに対して401を返さないのはなぜですか?
アヴナーシャハル

31
このロジックにより、どのアプリケーションも400の範囲の応答を返すべきではありません。これはまさに、400種類の応答が対象とする一種の条件です。また、あなたの最初の文は、あなたの前に投稿されたものだけでなく、将来のすべての答えに適用されますか?
ダウードはモニカ回復言う

31
ここで、これは単なる200であることに同意する必要があります。ユーザーが質問をし、それを理解し、正しい答えを知っており、答えを提供しました(これは「いいえ」です)。すべてがHTTPの世界にあります。
リーダニエルクロッカー

8
Hehe ...「これは実際にはエラーではありません」から
svidgen

28
この。「存在しないURLにアクセスしようとしました」は、「当社はあなたの地域では営業していません」とは大きく異なります。HTTPに関係するのは1つだけです。
CJデニス

87

5xxエラーはサーバーエラーです-サーバーで何かがおかしくなりました。特に、503は次のことを示します。

サーバーは現在、一時的な過負荷または定期的なメンテナンスのためにリクエストを処理できません

4xxエラーはクライアントエラーです-クライアントは、サーバーが処理できない、または処理する意思がないことを要求しています。特に、403

サーバーはリクエストを理解しましたが、承認を拒否しました。リクエストが禁止されている理由を公開したいサーバーは、応答ペイロード(もしあれば)にその理由を記述することができます。[..]ただし、資格情報とは無関係の理由で要求が禁止される場合があります。

503これは一時的な問題ではないため、明らかに間違っていると私は主張します-あなたはその領域、期間のリクエストをサポートしていません。最終的にそのエリアをサポートしたいという議論をすることもできますが、コードの目的は、クライアントがいつ再試行できるかを示すヘッダーを含めることです。「6か月後」は意図に準拠していません。

403 サービスは特定のロケールからのリクエストを禁止するだけなので、より良い選択です。


403は、アクセスが禁止されており、クライアントがそれについて何もできない場合に使用します。ただし、この場合、クライアントは(ラップトップまたは電話で車に乗ることができます)ので、403は不適切です。
gnasher729

2
@ gnasher729 4xxエラーは、403を含む、クライアントが修正できる可能性のあるものです。(リンクされた)仕様は、クライアントが異なるクレデンシャルで再試行できることを明示しています(クレデンシャルが問題であると仮定)。
jaxad0127

22
@ gnasher729 403は、人間がそれについて何もできないという意味ではありません。それはブラウザがそれについて何もできないことを意味します。人間はいつでもパスワードをリセットしたり、管理者と話したり、この場合は別の都市に移動したりできます。
スリーブマン

1
@ gnasher729クライアントはユーザーではありません。
キャプテンマン

10
5xx =申し訳ありませんが、問題を修正するまでお待ちください。4xx =申し訳ありませんが、ポリシーにより、現時点ではお客様のリクエストに対応できません。理由は
次のとおり

46

どちらでもない。

APIが適切に設計されている場合、URLには都市の名前が含まれます。たとえば、

http://example.com/API/Vienna/HailRide

または

http://example.com/API/HailRide?city=Vienna

IPジオロケーションは信頼性が低いため、ユーザーはVPNを使用している可能性があります。ユーザーは他の人のために乗車したい場合があります。ユーザーの位置に基づいて都市を提案するのはAPIクライアントの責任です。通常、クライアントにはユーザーの位置を特定するためのリソース(モバイルデバイスの位置情報サービスなど)がはるかに優れています。

それができたら、正しい答え

http://example.com/API/SomeUnsupportedCity/HailRide

または

http://example.com/API/HailRide?city=SomeUnsupportedCity

明らかになります:404見つかりません:SomeUnsupportedCityに乗車するためのリソースがありません。


6
これは受け入れられた答えであるはずです:API設計は古い数値コードに準拠することだけではなく、VPNなどに関するシナリオは非常に現実的です。
エドアルド

10
私はこれに反対しなければなりません。URLに都市の名前を含めると、クライアントが場所に基づいて都市名を決定することを余儀なくされるため、今後あらゆる種類の問題が発生する可能性があります。たとえば、あなたはロサンゼルスにいますか、ビバリーヒルズにいますか?ロンドンまたはウェストミンスター?クライアントがリチャードソンにいると考えているが、ダラス地域全体にサービスを提供するAPIが必要な場合はどうなりますか?クライアントがピックアップ/ドロップオフの場所を提供することをお勧めします。サーバーは、サービスエリア内にいるかどうかを判断し、それに応じて応答できます。
ザックリプトン

11
@ZachLipton都市名は単なる例であり、OPの実際のビジネスルールによって「都市」または「場所」をどのように定義するかによります。座標でもあります。
ベルギ

1
@ZachLiptonなし、ここでのポイントは、単に間違っていると、場所を理解するために、サービス利用クライアントIPを持っていない
エドアルド

3
@eddyceクライアントIPを使用することは多くの理由で悪い考えだと思います。/ API / Vienna / HailRideでも問題が発生しやすいと言っています。これは、クライアントが場所を都市名に変換する必要があるためです。
ザックリプトン

26

これは丸い穴/四角いペグの質問のようです。応答がHTTPコードである必要があるのはなぜですか?HTTPエラーコードは、すべてのユースケースをカバーできるとは限りません。

すべてのAPI呼び出しには、戻ってくる追加のメッセージ、つまり小さなJSONエラーメッセージが必要です。それらに403を渡し(場所を指定してAPIを使用する許可が本当にないため)、提案されているように追加の情報を返します。

これを行わない場合、次回はユーザーがSUVを要求したが、Priusのみが利用可能な場合に返すHTTPエラーコードを尋ねます。


5
最後の文に+1。うまくまとめています。
LoztInSpace

1
まあ、それは明らかに3xxリダイレクトである必要があります。;)
本名

最後のケースは、おそらく何らかの4xx応答を保証します。ユーザーは、サーバーが処理できない要求を出しました。選択肢が何らかの無効な入力である場合は400になり、場所自体が存在しない場合は404になります。ただし、検索条件であり、一致するものがない場合は200になります。
jpmc26

11

いくつかは理にかなっています。

403 Forbidden、エリック・スタインが答えで言及している理由のため。リクエストによって提供されるさまざまな情報を使用して、クライアントがどこにいるのか、クライアントが誰であるのかを判断し、そのリクエストに基づいて、サーバーが応答できない、または応答したくない場合があります。

ただし、場合によっては、返品ステータスとして451 Unavailable for Legal Reasonsを提示します。このステータスでは、関連する法律へのリンクを(ヘッダーに)含めることが期待されています。クライアントがリソースにアクセスすることは合法ではなく、サポートされていない地域やエリアにクライアントのより一般的なケースが存在しない場合に特に適しています。

5xxシリーズのステータスを回避します-これらは多くの場合、サーバー側の技術的な問題を示しています。ここではそうではないようです。


おそらくこの場合の理由は、自分の都市にない車についてユーザーに伝えることは意味がないからです。451
max630の

4
@ max630質問からそれを推測することはできません。403 Forbiddenはおそらく正しい選択です。ただし、サービスに法的制限がある場合は、より具体的な451を代わりに使用できます。451は、非常に特定のユースケースでは403のより具体的なバージョンと見なされることが多いので、それを提示するのが理にかなっています。
トーマスオーエンズ

8
@ max630-451が適切である可能性は完全にあります。多くの管轄区域では、この種のサービスの運営者は、サービスを提供する前に地域当局に登録する必要があります。実際には、エリア外から発信された特定のリクエストの処理は法的に禁止されている可能性があります。
ジュール

5

制限が法的な理由によるものである場合、適切なHTTPエラーコードはHTTP 451、「法的な理由により利用できません」です。

これは通常、DMCAのアクションまたはハラスメントキャンペーンなどによる訴訟のために取り消された資料の場合に使用されますが、応答定義の精神と手紙は次のように述べています。

このドキュメントでは、法的要求の結果としてリソースアクセスが拒否された場合に使用するハイパーテキスト転送プロトコル(HTTP)ステータスコードを指定します。

コード自体は、Ray Bradburyによる華氏451への参照です。


3

HTTPステータスコードが拡張可能であることを人々はよく忘れます。

HTTPステータスコードは拡張可能です。HTTPアプリケーションは、登録されたすべてのステータスコードの意味を理解する必要はありませんが、そのような理解は明らかに望ましいものです。ただし、アプリケーションは、最初の数字で示されているように、ステータスコードのクラスを理解しなければならず、認識されない応答はキャッシュされてはならないという例外を除き、そのクラスのx00ステータスコードと同等であるとして扱われます。たとえば、クライアントが認識できないステータスコード431を受信した場合、リクエストに何か問題があると安全に想定し、400ステータスコードを受信したかのように応答を処理できます。そのような場合、ユーザーエージェントは、応答で返されたエンティティをユーザーに提示する必要があります。

https://tools.ietf.org/html/rfc2616#section-6.1.1

APIおよびクライアントアプリケーションで使用するために、400の範囲で独自のステータスコードをいつでも作成できます。


リクエストにExpect token;city="Albequerque"ヘッダーが含まれていた場合、うーん...は必要ありません。その場合、最も適切な応答は417になり、予想は失敗しました。 tools.ietf.org/html/rfc2616#section-10.4.18 もちろん、これがWebサービス用であることを前提としています。
ベリンロリチュ

@BerinLoritschは必要ではないかもしれませんが、状況を既存のコードに強制的に適合させるのではなく、パントしてカスタムコードを使用する方がよい場合があります。
ラバーダック

0

「サービスが利用できない」という説明が問題と一致しているように見えるので、最初は503を考えましたが、定義を見ると503は実際にサーバーが利用できないことに固有です。さらに考えてみると、サーバー側の問題ではなく、リクエストに問題があることをクライアントに伝えています。

403の方が近いのは、メッセージを受け取って理解したが、サーバーはそれを満足させたくないということをユーザーに伝えるからです。これは混乱を招く可能性があるため、シナリオを説明するためにテキストによる説明を追加できます。RFCによれば、404もこのコードの有効な代替品です。

誰かがこのための新しいコードを考えていない限り、403または404が最も近いようです。


5xxコードではありません。これは、後でまったく同じ要求を試行すると成功する可能性があることを意味するためです。4xxコードは、少なくとも一部の要求(この場合は「サービスの場所」フィールド)を変更せずに再試行しないことをクライアントに確実に伝えます。
トビースパイト

0

エラーの説明と指定するコードを一致させる必要があります。

  • あなたが言うなら、あなたはサービスを利用できないと主張Service not available in your area.する404ので、あなたは与えるべきです

  • あなたが言うなら、あなたは発信者が認可されていないと主張You are not authorized for this service in your area.する403のであなたは与えるべきです。

2番目に行きます。


6
404は可用性に関するものではなく、存在に関するものです。ある状況でサービスが利用できないからといって、それがまったく存在しないと人々に思わせたくない限り、404応答を提供すべきではありません。この状況では、404応答は意味がありません。
ジュール

@jules 403の仕様(古くなっている可能性があります):「サーバーがクライアントにこの情報を提供したくない場合、代わりにステータスコード404(Not Found)を使用できます。」したがって、403がOKの場合、404も同様ですが、必ずしも指定された理由のためではありません。
ジミージェームズ

@JimmyJames-はい、それは仕様の範囲内ですが、問題のデバッグが非常に困難になるため、本当に悪い考えです。APIに必要なものではありません。
ジュール

3
@Julesサービスは一部の地域に存在しません。私の都市にしか存在しない小さな店がたくさんあるのと同じように、別の都市の住所に「正しい存在はない」と尋ねます。
アンディ

サービスのURLパスについての「存在」について話すのは最小限です-哲学、パスを公開したら答えを提供する必要があることを明確にするために、403はこの場合の方法であり、状況。
エドアルド

0

HTTP 451 Unavailable for Legal Reasonsステータスの修正を提案する現在のインターネットドラフト(2018年12月31日に期限切れになります)があります。ドラフトでは、451応答にはgeo-scope-block「[ISO.3166-1]で定義されているアルファ2国コードのコンマ区切りリストに対応する」ヘッダーを含める必要があることが示唆されています。ただし、ドラフトでは、コード451を「オペレーターが指定したポリシーに基づいて(オペレーターに法的な要求を課すのではなく)オペレーターがリソースへのアクセスを拒否するために」使用しないことも指定しています。

したがって、ジオブロックに対する法的要求がないと仮定すると、451は正しいコードではありません。正しいコードは何ですか?さて、他の多くの回答が403 Forbiddenをすでに示唆していますが、それらはすべて「意見ベース」であるように見えるので、他の人が何をしているか見てみましょう。

だから、唯一の普遍的な解決策はありません。あなたは自分の状況に最も合っていると思うものを選ぶ必要があります。ただし、どちらを選択した場合でも、応答本文で実際の問題を必ず説明してください。

RubberDuckがすでに回答したように、カスタムHTTPステータスコードを指定するだけで何も問題はないと思います。400の範囲のカスタムステータスコードは、実際にはかなり良い呼び出しでさえあるかもしれません。「HTTPステータス499」のようなものを見た場合、開発者の注目を確実に集めるからです。「403」は「OK」として渡すのが簡単すぎるため、パスワードを間違えたので、代わりに別のものを試してみましょう」と、無駄な時間になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.