現在、5つの都市でサービスを提供しています。他の都市からサービスAPIを呼び出そうとすると、このエラーService not available in your area
。
問題は、このエラーに適切なhttpコードは何ですか?
または、他の何か?
HTTPエラーコードは不適切です。 HTTPの観点からは、エラーや問題は発生しないので、200の範囲内である必要があります。一部のユーザーにサービスを提供しないことを通知するドキュメントを送信することにより、サービスが提供されないことを丁寧に伝えます。そして、これはすべてうまくいきます。
ユーザーはアプリケーションを使用できなくなります。これは、ビジネスロジックによって行われた意識的な決定であり、事故ではありません。 HTTPレベルでは、すべてが本当のことです。
編集
ここで見ているのは、古い学校と新しい学校の対立です。 HTTPが設計されたとき、Webサービス、SOAP、JSON、RESTの原則はありませんでした。上記のプロトコルとしてTCPこれはすでに考慮されていましたアプリケーションレベルと多くの高レベルのステータスコードが定義されました。Webがよりリッチで高レベルのサービスに使用され始め、「エンベロープ」を転送する一般的な手段が必要になったとき、設計者は新しいものを定義するのではなくHTTPを乗っ取りましたHTTPがいたるところに存在していたからといって、よりクリーンなプロトコルです。
そのため、最新のWebサービスのコンテキストでは、HTTPは実際にはダムトランスポートレイヤーにすぎず、そのコードのほとんどは適用できないか時代遅れであると見なされる場合があります。アプリケーションの状態に近づき、たまたまリストに含まれているため、1つを選択するだけで問題がありませんでしたが、間違ったメッセージが送信されると思います。 HTTPがWebサービスのコンテキストでその調整の役割を果たすことを望まない。
5xx
エラーはサーバーエラーです-サーバーで問題が発生しました。特に、 5 は次のことを示します。
一時的な過負荷または定期メンテナンスのため、サーバーは現在リクエストを処理できません
4xx
エラーはクライアントエラーです。クライアントは、サーバーが実行できない、または実行することを望まないという要求を出しています。特に、 4 は、
サーバーは要求を理解しましたが、承認を拒否しました。要求が禁止された理由を公開したいサーバーは、その理由を応答ペイロード(存在する場合)に記述できます。 [..]ただし、認証情報とは無関係の理由により、リクエストが禁止される場合があります。
503
は明らかに不正解です。これは一時的な問題ではないため、その地域の期間のリクエストはサポートされません。最終的にそのエリアをサポートすることを希望するという主張をすることもできますが、コードの目的は、クライアントがいつ再試行できるかを示すヘッダーを含めることです。 「6ヶ月後」はその意図を守っていません。
403
は、サービスが特定のロケールからのリクエストを単に禁止するため、より良い選択です。
それらのどちらでもない。
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 Not Found:SomeUnsupportedCityで配車を依頼するためのリソースが存在しない。
これは丸い穴/四角いペグの質問のようです。唯一の応答がHTTPコードである必要があるのはなぜですか? HTTPエラーコードは、すべてのユースケースをカバーできるわけではありません。
すべてのAPI呼び出しには、戻ってくる追加のメッセージ(つまり、小さなJSONエラーメッセージ)が必要です。それらに403を与え(場所には指定されたAPIを使用する権限がないため)、提案されているように追加の情報を返します。
これを行わない場合、次回は、ユーザーがSUVを要求したときに返されるHTTPエラーコードを尋ねますが、使用できるのはPriusだけです。
いくつかは理にかなっています。
403 Forbidden Eric Steinが彼の回答で述べている の理由による。要求によって提供されるさまざまな情報を使用して、クライアントの場所とクライアントの場所を判別できます。その要求に基づいて、サーバーは応答できないか、応答することを望みません。
ただし、場合によっては、451の法的理由により利用不可の返品ステータスを提示することもできます。このステータスでは、関連する法律へのリンクを(ヘッダーに)含める必要があります。具体的には、クライアントがリソースにアクセスすることが合法ではなく、サポートされていないリージョンまたはエリアにクライアントの一般的なケースが存在しない場合です。
5xxシリーズのステータスは避けます。これらはサーバー側の技術的な問題を示していることがよくあります。ここではそうではないようです。
制限が法的な理由によるものである場合、適切なHTTPエラーコードは HTTP 451、 "法的な理由により使用できません。"
これは通常、DMCAのアクションまたは嫌がらせキャンペーンなどによる訴訟のために取り消された資料の場合に使用されますが、 回答の精神と手紙 は次のように述べています。
このドキュメントでは、法的要求の結果としてリソースアクセスが拒否された場合に使用するハイパーテキスト転送プロトコル(HTTP)ステータスコードを指定します。
コード自体は、Ray Bradburyによる Fahrenheit 451 への参照です。
多くの場合、HTTPステータスコードは拡張可能であることを忘れます。
HTTPステータスコードは拡張可能です。 HTTPアプリケーションは、登録されたすべてのステータスコードの意味を理解する必要はありませんが、そのような理解が明らかに望ましいです。ただし、アプリケーションは最初の桁で示されるように、ステータスコードのクラスを理解しなければならず、認識されない応答はキャッシュされてはならないことを除いて、認識されない応答をそのクラスのx00ステータスコードと同等として扱う必要があります。たとえば、認識されないステータスコード431をクライアントが受信した場合、リクエストに問題があると安全に想定し、400ステータスコードを受信したかのように応答を処理できます。そのような場合、そのエンティティは異常なステータスを説明する人間が読める情報を含む可能性が高いので、ユーザーエージェントはユーザーに応答で返されたエンティティを提示する必要があります。
https://tools.ietf.org/html/rfc2616#section-6.1.1
APIとクライアントアプリケーションで使用するために、常に独自の 400の範囲のステータスコード を作成できます。
「サービスを利用できません」という説明は問題と一致しているように思われるが、 definitions を見ると、503は最初は503だと思った。次に、さらに考えて、サーバー側に問題があるのではなく、リクエストに問題があることをクライアントに伝えます。
403の方が近いのは、メッセージを受信して理解したことをユーザーに伝えているが、サーバーはそれを満足する気がないためです。これは混乱を招く可能性があるため、シナリオを説明するテキストによる説明を追加できます。 RFCによれば、404もこのコードの有効な代替物です。
誰かがこのための新しいコードを考え出していない限り、403または404が最も近いようです。
エラーの説明と、提供するコードを一致させる必要があります。
あなたが言うなら Service not available in your area.
次に404
あなたはサービスがavailableではないと主張しているからです。
あなたが言うなら You are not authorized for this service in your area.
次に403
発信者がauthorizedではないと主張しているため。
2番目に行きます。
HTTP 451の法的理由による利用不可の修正を提案する 現在のインターネットドラフト (2018年12月31日に期限切れ)があります 状態。ドラフトでは、451応答にgeo-scope-block
ヘッダー。「[ISO.3166-1]で定義されたアルファ2国コードのカンマ区切りのリストに対応する」。ただし、草案では、コード451を「オペレーターが指定したポリシーに基づいてリソースへのアクセスを拒否するために(オペレーターに課される法的要求とは対照的に)コード451を使用してはならない」とも規定しています。
したがって、ジオブロックに対する法的な要求がないと仮定すると、451は正しいコードではありません。それでは正しいコードは何ですか?まあ、他の多くの回答がすでに示唆しています403 Forbiddenが、それらはすべて「意見に基づく」ように思われるので、他の人が何をしているか見てみましょう:
したがって、普遍的な解決策は1つではなく、状況に最も適したものを選択する必要があります。ただし、どちらを選択する場合でも、必ず応答本文で実際の問題を説明してください。
RubberDuckは既に回答済み のように、カスタムHTTPステータスコードを指定するだけでは何も問題はないと思います。 400の範囲のカスタムステータスコードは、実際にはかなり良い呼び出しである可能性もあります。これは、 "HTTPステータス499"のようなものが表示されれば、開発者の注意を引くことになるためです。 「403」は「OK」として渡すのが簡単すぎるため、パスワードを間違えたので、代わりに別の方法を試してみてください」。その結果、時間が無駄になります。