REST APIで「まだ準備ができていません。後でもう一度やり直してください」のHTTPステータスコードを選択するには [閉まっている]


152

私はhttp://server/thingyapi/thingyblob/1234、ダウンロードするもの1234に関連付けられたファイル(別名「blob」)を返すRESTful APIを開発しています。ただし、サーバーにファイルが存在しないときに要求が行われた可能性ありますが、後で確実に使用できるようになります。サーバーには、すべてのもののすべてのblobを生成するバッチプロセスがあります。Thingy 1234はすでに存在し、Blob以外のそのデータはすでに利用可能です。サーバーは、まだ1234のblobを生成する必要がありません。

404を返したくありません。それは存在しないもののためのものです。これは存在するものですが、そのBLOBはまだ生成されていません。ちょっと「処理中」のYouTube動画が好きです。リダイレクトコードも適切だとは思いません。試す「他の」URLはありません。

このような場合に返される正しいHTTPステータスコードは何ですか?



7
まず、thingy 1234がまだGET可能な表現を持っていない場合、それはどのような意味で(クライアントの観点から)リソースとして存在しますか?サーバーの内部に1234を作成するためのキューに入れられたジョブがあるという事実は、リソース1234が存在することを意味しているようには見えません。次に、クライアントはどこでURI ... / thingyblob / 1234を取得しましたか?リソースが実際にGET可能になるまで、サーバーはおそらくそのURIをクライアントに提供すべきではありませんでした。
アンディデニー

1
Thingには、ブロブ以外に取得する価値のある他のプロパティがあります。生成に時間がかかるのはブロブだけです。クライアントは、たとえば、server / thingyapi / thingy / 1234で
JCCyC

10
HTTP標準は、どの状況コードをどの状況コードで使用するかについてのガイダンスを提供します。したがって、この質問は実際には主に意見に基づくものではありません。
Raedwald 2016年

2
どの程度204「コンテンツなし」?Isは、サーバーがリクエストを正常に処理し、[現時点では]コンテンツを返さないことを示します。
Timo

回答:


77

お勧めし202 - Acceptedます。ドキュメントから:

リクエストは処理のために受け入れられましたが、処理は完了していません。[...]その目的は、サーバーが他のプロセス(おそらく、1日1回だけ実行されるバッチ指向のプロセス)の要求を受け入れることを可能にすることです。


62
-1:これは、 "thingy#1234"を最終的に作成するプロセスを開始するリクエストには意味がありますが、 "thingy#1234"自体に対して後で発行されるGETリクエストには意味がありません。特に、202は、GET要求の結果として、サービスが「thingy#1234」のデータを後で送信することを示唆しています。これは単に正しくありません。
Sam Harwell 2014年

7
また、「このレスポンスで返されるエンティティには、リクエストの現在のステータスの表示と、ステータスモニターへのポインターまたはユーザーがリクエストが実行されると予想できる時期の推定が含まれている必要があります。」 blobの準備がまだ整っていないことをクライアントに知らせるための適切な方法と、準備が整ったときにそれを見つける方法。
レミールボー2014年

3
「処理の受け入れ」は、後で処理するリクエストを保存していることを示していると私は主張します。無視されているだけの場合は、4xxまたは5xxコードを返して、クライアントに再試行する可能性があることを示す必要があります。
ルーク、

3
102(処理)も、webdavの仕様ではありますが、妥当な選択である場合があります。
akostadinov 16

2
この答えにはこれ以上同意できません。サーバーは何も返さないか、計画を立てていません(この要求のために処理を実行していません-GETのためにとにかくすべきではありません)。そのため、リソースは何らかの方法でクライアントから利用できません。これはエラーとして扱われるため、2XXコードは適切ではありません。4XXまたは5XXスペースの何か。リクエストが「処理のために受け入れられた」わけでなく、リクエストは実際には破棄されている
Adam

52

このような「問題」はサーバー側にあります。クライアントは整形式の要求を行いましたが、サーバーはそれを満足できません。したがって、「サーバーエラー」、5xxステータスコードを使用する傾向があります。

Quoth RFC 7231(現在のHTTP標準、強調が追加されています):

ステータスコードの5xx(サーバーエラー)クラスは、サーバーがエラーを検出したか、要求されたメソッドを実行できないことをサーバーが認識していることを示します。HEADリクエストに応答する場合を除いて、サーバーは、エラー状況の説明と、それが一時的な状態か永続的な状態かを含む表現を送信する必要があります(SHOULD)。

注意

  • 「エラーが発生した、リクエストを実行できません」:「サーバーエラー」というタイトルにもかかわらず、サーバーエラーだけではありません。
  • 一時的または永続的」:これらのコードは、あなたのような一時的に利用できないリソースに適しています。

利用可能なコードのうち、503、「Service Unavailable」が最適でした。

503(Service Unavailable)ステータスコードは、一時的な過負荷または定期メンテナンスのために、サーバーが現在リクエストを処理できないことを示しています。サーバーは、リクエストを再試行する前にクライアントが待機する適切な時間を提案するために、Retry-Afterヘッダーフィールドを送信する場合があります。

注意:

  • 「少し遅れて緩和される可能性が高い」:ケースに当てはまります。
  • 「一時的な過負荷」:あなたのケースでは、はっきりとは当てはまりません。ただし、サーバーがはるかに高速である場合、クライアントが要求を行ったときにバッチ処理が既に行われているため、それ一種の「過負荷」です。つまり、クライアントはサーバーが実行できるよりも速くリソースを要求しています。それらは利用可能です。
  • 再試行はサービスに適しているため、返信にはRetry-After値を含める必要があります。バッチプロセスの次の実行の推定完了時間、またはバッチプロセスの実行間隔を値として提供できます。

独自の5xxステータスコード(たとえば、591)を定義すると、は許可されますが、セマンティクスが正しくなくなります。

クライアントは、最初の桁で示されるように、ステータスコードのクラスを理解し、認識されないステータスコードをそのクラスのx00ステータスコードと同等のものとして扱う必要があります。

クライアントは、自分のステータスコードを500「内部サーバーエラー」として扱いますが、これは正しくありません。


2
:私はそれが良い202以上だかを確認するために失敗しbenramsey.com/blog/2008/04/...
JCCyC

4
@JCCyCあなたのブログは、何かを作成する要求(POSTまたはPUT)に応答して202を返すのに適した例です。質問は、GETに何を返すかを尋ねているようです。
Raedwald 2012

@JCCyCそれはノットレディネスの別の色合いと見なすことができます:そのリソースへのajaxを想像してください。成功ステータスとして202を、エラーステータスとして503を好みますか?そのため、応答に対するアプリの反応のコンテキストで、どの意味を暗黙的に優先するかを確認できます
rloth

また、私は何かが「準備ができていない」とよく行く「再試行-後」の実用的な側面のような
rloth

1
注意:「Retry-After」も使用でき307 - TEMPORARY REDIRECTます。これは、
リソース

28

423-Lockedはこの目的に使用できると思います:

423(ロック済み)ステータスコードは、メソッドのソースまたは宛先リソースがロックされていることを意味します。この応答には、「lock-token-submitted」や「no-conflicting-lock」などの適切な前提条件または事後条件コードを含める必要があります(SHOULD)。


1
正解です。なぜ賛成票が増えないのかしら。
lex82

10
多分それはWebDAV HTTPコードだからですか?
ステファンL

1
akka-httpからStatusCode RetryWith = reg(c(449)( "Retry With"、 "リクエストは適切なアクションを実行した後で再試行する必要があります。"))アクションがあります
ozma

2
多くの点で私はこれに同意します。同様の状況があります(私の場合、まだ入力されていない可能性があるインデックスから検索しています)。意味的に、これは正しいと思います。ただし、423のRFCには、「この応答には、「lock-token-submitted」や「no-conflicting-lock」などの適切な前提条件または事後条件コードを含める必要があります(SHOULD)。 ここでそれを適用する方法がわかりません。個人的には409 Conflictを使用しますが、コメントなしで反対票を投じました-なぜだかわかりませんか?
アダム

22

404を返したくありません。それは存在しないもののためのものです。

URLはThingのリクエストに対応していません。

http://server/thingyapi/thingyblob/1234

クライアントは、存在しないthingyblobを要求しています。それが存在する場合、あなたは彼らにそれを与えるでしょう。

404。


1
誰かがこれを言ってくれてうれしい!503適切な対応だと思う人はあまりいないと思います。他の奇妙な提案のいくつかは言うまでもありません。
Jason Desrosiers 2015

ここでは404が最も適切な応答であることに同意しますが、OPの質問に答えることはできません。Retry-Afterフィールドは最適な候補のようですが、正式には503および3xxコードにのみ使用できます。@ジェイソン:私はそれが奇妙な提案のいくつかを説明していると思います。
Ron Deijkers 2015

これが最良の答えだと思います。404レスポンスで本文を返すことができます。ボディは事が後で利用可能になることを示すことができます。または、Retry-Afterヘッダーも使用します。規格はこのケースをうまくカバーしていないため、ここで少し拡張する必要があります。
WW。

4
人々は404に慣れすぎて、APIのコンテキストでは、ページを論理的に切り離すことができないことがわかりません。
マフィンマン

1
これはsooooo 404です。Thingyblobはまだ存在しないか、または存在しません。現時点では存在せず、その404です。サーバーからクライアントにメッセージをプッシュすることで解決できる別の問題が発生します。もう一度ゲット
100r

21

別のオプション:503 - Service Unavailable


5
W3Cよると、クライアントに伝えたいことではありません(なんらかの方法で「再び来る」ことを意味します)。「サーバーは現在、サーバーの一時的な過負荷またはメンテナンスのため、要求を処理できません。その意味は次のとおりです。これは一時的な状態であり、ある程度の遅延の後に緩和されます。遅延の長さがわかっている場合は、Retry-Afterヘッダーにその長さが示される場合があります。Retry-Afterが指定されていない場合、クライアントは、 500応答。」
スケーリー2013年

4
サービスは利用できません。サービスは利用できますが、処理は完了していません。したがって、503はおそらく良いアイデアではありません。
Ishtiaque Khan

17

リソースの準備ができていないので、リソースがいつ(およそ)使用可能になるのか、およびクライアントがいつ要求を再試行するのかがわかるでしょう。これは、Retry-Afterヘッダーを利用したい場合があることを意味します。このヘッダーは503(Service Unavailable)で有効です。これは、メンテナンスのためにサイト全体がダウンしていることを意味し、3xx(リダイレクト)応答があります。

私の意見では、Retry-Afterヘッダー付きの302(Found)が最良のオプションですが、応答ヘッダーのLocationフィールドが要求URLと等しいかどうかはわかりません。とにかく、それは循環リダイレクトです。


3
許可されている場合でも、クライアントがRetry-Afterヘッダーのサポートを実装していない場合、同じページへの3xxリダイレクションは最終的に503 ...で終了する可能性があります(もちろんオプションでRetry-Afterヘッダーを使用)
Ronデイカーズ

1
Retry-Afterは、RFC 6585(2012年4月)によって追加されたHTTP 429 "Too Many Requests"でも有効です。これは、リソースの準備がまだできていない理由が、クライアントがサーバーに与える作業が多すぎるためである場合に適しています。
Silas S. Brown

8

409紛争

複数の更新の場合の編集の競合など、要求の競合のために要求を処理できなかったことを示します。[出典ウィキペディア。]

これは適切な場合があります。

データを返すことで要求を満たすことができない場合は、成功しません。202は、サーバーが要求をキューに入れ、後で要求を実行することを示唆していると思います。しかし、あなたの場合、リクエストは現在データ用であり、失敗しています。後で再試行すると、別の要求になります。

競合していると思います。データが必要ですが、編集中または更新中です。これは、Thingy1234が既に存在し、以前は正常にダウンロードされていたが、現在編集中である場合、編集が行われている間は利用できなかった場合にも当てはまります。


2
なぜこれが否決されたのかわかりません。私には正しい答えのようです。RFCから:「409(競合)ステータスコードは、ターゲットリソースの現在の状態との競合が原因で要求を完了できなかったことを示しています。このコードは、ユーザーが競合を解決でき、リクエストを再送信してください。「サーバーがリソースを更新中であるため、つまりリソー​​スの現在の状態が原因で、サーバーが返すことができないリソースを要求しました。クライアントは待機して再送信することでこれを解決できます
Adam

1
@Adam「ユーザーが競合を解決できる可能性がある」ということは、再提出に関する何かが、ただ待つだけでなく、異なるということだと思います。
ホリスティックデベロッパー

3

501-実装されていません

それがどのように聞こえるかがまさに好きです。まだ実装されていないが、将来の可用性を意味する機能。

5xxエラーの概要へのリンクは次のとおりです


4
この質問の場合、機能自体は存在するようですが、要求されているアイテムは存在しません。
ルーク、

@Luke 501の私の回答のリンクからの説明、「...要求を満たす能力がありません。通常、これは将来の可用性を意味します。これは、OPが要求していたことを正確に満たします。彼のサーバーまたはDBにデータが存在するかどうかに関係なく。最終的な結果として、現時点ではAPI経由でアクセスできません。したがって、APIはリクエストを実行できませんが、将来的にはhttpコードを介して利用できるようになることを意味します。
ダン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.