コードを引き換え済みとしてマークするPOSTリクエストを受け入れるRESTエンドポイントがあります。コードは特定の日付の間でのみ利用できます。
誰かがコードを早期に引き換えようとした場合、どのように対応すればよいですか?
HTTP 403、Forbiddenが正しい選択だと思いますが、w3cは「リクエストは繰り返されるべきではない」と述べていますが、この場合、リクエストは後日繰り返されると予想します。
コードを引き換え済みとしてマークするPOSTリクエストを受け入れるRESTエンドポイントがあります。コードは特定の日付の間でのみ利用できます。
誰かがコードを早期に引き換えようとした場合、どのように対応すればよいですか?
HTTP 403、Forbiddenが正しい選択だと思いますが、w3cは「リクエストは繰り返されるべきではない」と述べていますが、この場合、リクエストは後日繰り返されると予想します。
リソースの現在の状態と競合しているため、リクエストを完了できませんでした。このコードは、ユーザーが競合を解決してリクエストを再送信できると予想される状況でのみ許可されます。応答本文には、ユーザーが競合の原因を認識するのに十分な情報を含める必要があります。理想的には、応答エンティティには、ユーザーまたはユーザーエージェントが問題を修正するのに十分な情報が含まれます。ただし、それは不可能な場合があり、必須ではありません。
403 Forbiddenは、すでに引き換えられたクーポンを引き換えようとしている場合に意味がありますが、この状況でも410Goneの継ぎ目はエレガントです。
404 Not Foundは、リソースが実際に存在するため理想的ではありませんが、403で理由を指定したくない場合、またはセキュリティ上の理由でリソースの存在を非表示にしたい場合に使用できます。
HATEOASを使用している場合は、クーポンを利用できるときにredeem
、クーポンリソース(を介して取得)にハイパーメディアコントロールを含めるだけで、(いわば)パスでクライアントを引き離すこともできます。GET
ただし、これは、過度にバインドされたクライアントがとにかくそれを引き換えようとするのを止めることはありません。
Rest URLはリソースを表す必要があるため、 404で返信します-見つかりません
リソースは特定の日付の間でのみ使用可能であるため、他の日付では見つかりません。
編集:いくつかの良い批評(下記参照)のおかげで、私はこの答えに注意したいと思います。これは、Richardson&Rubyの記事に基づいていますが、403Forbiddenに関するhttpbisの記事とはおそらくうまく一致していません。(個人的には、トムが別の回答で説明しているように、今は409に向かって学習しています。)
403Forbiddenが最良の選択です。RichardsonとRubyによるRESTfulWebサービスを1行ずつ引用します。ご覧のとおり、403は最適です。
クライアントの要求は正しく形成されていますが、サーバーはそれを実行することを望んでいません。
小切手!
これは単に不十分な資格情報の場合ではありません:それは401(「無許可」)になります。これは、特定の時間にのみ、または特定のIPアドレスからのみアクセスできるリソースのようなものです。
小切手!
403の応答は、クライアントが実際に存在するリソースを要求したことを意味します。401( "Unauthorized")と同様に、サーバーがこの情報さえも提供したくない場合は、代わりに404( "Not Found")を送信することができます。
あなたは上記のように書いています:「コード表現は、ライブになる前に取得することができます。」だから、あなたは何も隠そうとはしていません。だから、403に固執します。チェックしてください!
クライアントの要求が整形式である場合、なぜこのステータスコードが5xxシリーズ(サーバー側エラー)ではなく4xxシリーズ(クライアント側エラー)にあるのですか?サーブは、フォーム以外のリクエストのいくつかの側面に基づいて決定を下したためです。たとえば、リクエストが行われた時刻。
小切手!クライアントのリクエストは修正されて形成されましたが、特定の時間には不適切でした。
私たちは4対4で行きました。403コードが勝者です。他のコードも一致しません。
とはいえ、単純で非特定の400は間違いではありませんが、それほど具体的でも有用でもありません。
別の回答は、409の競合コードを示唆していました。検討する価値はありますが、それほど適切ではありません。これが理由です。リチャードソン&ルビーによると:
この[409]応答応答を取得するということは、サーバーのリソースを不可能または一貫性のない状態にしようとしたことを意味します。空でないバケットを削除しようとすると、AmazonS3はこの応答コードを返します。
「アクティブ」になる前にプロモーションを要求しても、「サーバーリソースが一貫性のない状態になる」ことはありません。それはいくつかのビジネスルールを破り、不正行為を引き起こしますが、私が見る論理的な矛盾を引き起こすことはありません。
ですから、質問を始めたときに気づいたかどうかにかかわらず、403は素晴らしい選択です。:)
「繰り返さないでください」というリクエストは、視聴者に送信する必要のあるメッセージを指します。
実際のリクエストが繰り返されるかどうかとは関係ありません。(ユーザーは、必要に応じて同じ403メッセージを何度も受け取ります。)
とは言うものの、リソースが利用可能であるため、404はこれには適していません。コードが引き換え可能/引き換えが禁止されていないというだけです。URLリンクまたはサーバー構成を間違えた可能性があることをユーザーに通知するため、実際には有害です。
もちろん、これは適切な日に代わりに200を返すことを前提としています。