10

少し調べてみましたが、リクエストが成功したときの HTTP ステータス コードは表示されませんが、「ポイント オブ ノー リターン」の後にエラーが発生します。

たとえば、リクエストを処理してデータベースにコミットするとしますが、結果を返すときにメモリが不足したり、NPE に遭遇したりします。それ応答であったはず200ですが、現在、内部的に、適切で整形式の応答を返すことができません。

202 Acceptedすでにリクエストを処理しているため、適合しないようです。

「成功したがエラー」を意味するステータス コードは何ですか? 存在しますか?

4

3 に答える 3

4

HTTP にはそのようなステータス コードはありませんが、そのような状況を処理できるベスト プラクティスがあります - POST 操作の後にユーザーをリダイレクトします。

ここに内訳があります-

  1. POST リクエストがサーバー上のデータを変更しようとしています
  2. サーバーに障害が発生した場合、サーバーは失敗を示すために 500 エラーを送信します。
  3. サーバーが成功すると、302 リダイレクト応答を送信します
  4. 次に、ブラウザは新しい GET リクエストをサーバーに送信します
  5. これに失敗すると 500 エラーが発生し、それ以外の場合は 200 エラーが発生します。

したがって、「保存されたデータはすぐに取得できない」というユースケースは、最初の POST の 302 リダイレクトに変換され、その後の GET の 500 に変換されます。

このアプローチには他にも利点があります。「データを再送信してもよろしいですか?」という煩わしさから解放されます。メッセージ。また、戻る/進む/更新ボタンを使用できるようにします。

于 2010-06-18T05:40:02.660 に答える
3

サーバーが問題が発生したことを認識している場合、通常は5xxエラーを返す必要があります。最も一般的なものは、500 Server ErrorRFC2616次のように定義しているです。

500内部サーバーエラー

サーバーで予期しない状態が発生したため、サーバーは要求を実行できませんでした。

次に、リクエストを再試行するのはクライアントの責任です。前のリクエストが部分的にコミットされた場合、それをロールバックするか、重複するトランザクションを適切に処理するのはサーバー(またはデータベース)の責任です。

于 2010-06-18T03:14:36.133 に答える
1

適切な応答は HTTP 500 (サーバー エラー) であるという @Daniel に同意します。Web アプリケーションは、エラーが発生したときにトランザクションをロールバックするように作成する必要があります。

Web アプリケーションで活用できることの 1 つは、「冪等性」です。これは、同じ結果を得るために何度でも繰り返すことができる関数 (または演算) の特性です。たとえば、読み取りが失敗した場合、クライアントは成功するまで単純に再試行できます。削除が失敗したように見える場合、クライアントは再試行でき、サーバーは、削除されているリソースが既になくなっているかどうかに関係なく、要求を有効なものとして扱います。また、更新が失敗したように見える場合、クライアントは、サーバーから正常に返されるまで更新を再試行できます。Web サービスを設計するための REST アプローチでは、冪等性を多用して、エラーに直面しても操作を堅牢にします。

于 2010-06-18T03:45:02.920 に答える