現在、5つの都市でサービスを提供しています。誰かが他の都市からサービスAPIを呼び出そうとした場合、このエラーをスローしますService not available in your area
。
問題は、このエラーに適切なhttpコードは何ですか?
- 503:サービスを利用できません
- 403禁止します
または、他の何か?
現在、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つを選ぶだけですが、間違ったメッセージを送信すると思います。WebサービスのコンテキストでHTTPがその規制の役割を果たすことは望ましくありません。
5xx
エラーはサーバーエラーです-サーバーで何かがおかしくなりました。特に、503は次のことを示します。
サーバーは現在、一時的な過負荷または定期的なメンテナンスのためにリクエストを処理できません
4xx
エラーはクライアントエラーです-クライアントは、サーバーが処理できない、または処理する意思がないことを要求しています。特に、403は
サーバーはリクエストを理解しましたが、承認を拒否しました。リクエストが禁止されている理由を公開したいサーバーは、応答ペイロード(もしあれば)にその理由を記述することができます。[..]ただし、資格情報とは無関係の理由で要求が禁止される場合があります。
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見つかりません:SomeUnsupportedCityに乗車するためのリソースがありません。
これは丸い穴/四角いペグの質問のようです。応答がHTTPコードである必要があるのはなぜですか?HTTPエラーコードは、すべてのユースケースをカバーできるとは限りません。
すべてのAPI呼び出しには、戻ってくる追加のメッセージ、つまり小さなJSONエラーメッセージが必要です。それらに403を渡し(場所を指定してAPIを使用する許可が本当にないため)、提案されているように追加の情報を返します。
これを行わない場合、次回はユーザーがSUVを要求したが、Priusのみが利用可能な場合に返すHTTPエラーコードを尋ねます。
いくつかは理にかなっています。
403 Forbidden、エリック・スタインが答えで言及している理由のため。リクエストによって提供されるさまざまな情報を使用して、クライアントがどこにいるのか、クライアントが誰であるのかを判断し、そのリクエストに基づいて、サーバーが応答できない、または応答したくない場合があります。
ただし、場合によっては、返品ステータスとして451 Unavailable for Legal Reasonsを提示します。このステータスでは、関連する法律へのリンクを(ヘッダーに)含めることが期待されています。クライアントがリソースにアクセスすることは合法ではなく、サポートされていない地域やエリアにクライアントのより一般的なケースが存在しない場合に特に適しています。
5xxシリーズのステータスを回避します-これらは多くの場合、サーバー側の技術的な問題を示しています。ここではそうではないようです。
制限が法的な理由によるものである場合、適切なHTTPエラーコードはHTTP 451、「法的な理由により利用できません」です。
これは通常、DMCAのアクションまたはハラスメントキャンペーンなどによる訴訟のために取り消された資料の場合に使用されますが、応答定義の精神と手紙は次のように述べています。
このドキュメントでは、法的要求の結果としてリソースアクセスが拒否された場合に使用するハイパーテキスト転送プロトコル(HTTP)ステータスコードを指定します。
コード自体は、Ray Bradburyによる華氏451への参照です。
HTTPステータスコードが拡張可能であることを人々はよく忘れます。
HTTPステータスコードは拡張可能です。HTTPアプリケーションは、登録されたすべてのステータスコードの意味を理解する必要はありませんが、そのような理解は明らかに望ましいものです。ただし、アプリケーションは、最初の数字で示されているように、ステータスコードのクラスを理解しなければならず、認識されない応答はキャッシュされてはならないという例外を除き、そのクラスのx00ステータスコードと同等であるとして扱われます。たとえば、クライアントが認識できないステータスコード431を受信した場合、リクエストに何か問題があると安全に想定し、400ステータスコードを受信したかのように応答を処理できます。そのような場合、ユーザーエージェントは、応答で返されたエンティティをユーザーに提示する必要があります。
Expect token;city="Albequerque"
ヘッダーが含まれていた場合、うーん...は必要ありません。その場合、最も適切な応答は417になり、予想は失敗しました。 tools.ietf.org/html/rfc2616#section-10.4.18 もちろん、これがWebサービス用であることを前提としています。
「サービスが利用できない」という説明が問題と一致しているように見えるので、最初は503を考えましたが、定義を見ると503は実際にサーバーが利用できないことに固有です。さらに考えてみると、サーバー側の問題ではなく、リクエストに問題があることをクライアントに伝えています。
403の方が近いのは、メッセージを受け取って理解したが、サーバーはそれを満足させたくないということをユーザーに伝えるからです。これは混乱を招く可能性があるため、シナリオを説明するためにテキストによる説明を追加できます。RFCによれば、404もこのコードの有効な代替品です。
誰かがこのための新しいコードを考えていない限り、403または404が最も近いようです。
エラーの説明と指定するコードを一致させる必要があります。
あなたが言うなら、あなたはサービスを利用できないと主張Service not available in your area.
する404
ので、あなたは与えるべきです。
あなたが言うなら、あなたは発信者が認可されていないと主張You are not authorized for this service in your area.
する403
のであなたは与えるべきです。
2番目に行きます。
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」として渡すのが簡単すぎるため、パスワードを間違えたので、代わりに別のものを試してみましょう」と、無駄な時間になります。