1

わかった。このシナリオで考えられる HTTP ステータス (応答) コードは何だろうと思っています。

たとえば、POST /Student/生徒のリソースを作成します。更新するテーブルが複数あるとします。Studentリソースが作成されます。

通常、リソースが作成されると、すぐにリソースが返され200 Successfulます。

ただし、リソースが作成されていると仮定しますが、リソースをプルしようとすると (データベースからのクエリ) 失敗します。どのステータス コードを返す必要がありますか?

   `201 Created`? (No resource)
   '200 Successful`? but without the resource. 
   `500 Internal Server Error`?

他の何か?

かなり一般的なシナリオだと思います。

編集

これを明確にしたい。まず、リソースを作成するためのすべての 1 つの POST 呼び出しです。応答は200、JSON としてのリソース オブジェクトである必要があります。ただし、リソースの取得中にのみエラーが発生します(リソースは正常に作成されました)。

データベースからリソースを取得できない理由は断続的である可能性があり、サーバー/ネットワークに関連している可能性があり、後で特定して修正することができます。しかし、リソースは確かに正常に作成されました。

4

3 に答える 3

2

リソースが作成されたと仮定しますが、リソースをプルしようとすると (データベースからのクエリ) 失敗します

その場合、リソースは作成されていませんあったように見えただけです。これは確かにサーバー側のエラーであるため、5xx コードです。

障害を引き起こしたユーザー指定のパラメーターがない限り、その場合は 4xx コードになります。

更新: または、私が誤解していて、作成に問題がなく、リソース ID が返された後、その後の有効なGETクエリでリソースが見つからなかった場合、その場合、サーバー コードに何か問題があります。以前に 5xx エラーを発行する必要がありました。回避策として、リソースを作成し、リソース作成コードからクエリを発行して、200 を返すか、失敗した場合はクリーンアップ、再試行、または 5xx を返すことが考えられます。しかし、実際にすべきことは、リソースが消失したり、作成されたように見えるだけの原因を調査することです (たとえば、同時実行性の問題、不適切なトランザクション管理、キャッシュなど)。

複雑なシナリオ

REST サービスはリソースの作成を要求し、サーバーはその要求を受け入れます。サーバー自体がリクエストをバックエンド、たとえばデータベースにルーティングし、データベースは (サーバーに) 「OK」とリソース ID を返します。次に、念のため、サーバーは をチェックし、リソース ID を要求します。データベースは「そのようなリソースはありません」と応答します。

この場合、サーバーは良心的に 200 コードとリソース ID をクライアントに返すことができません。これは、クライアントがそのリソース ID を使用しようとすると問題が発生すると疑う十分な理由がある場合ではありません。また、後でエラーを検出するのははるかに難しい場合があります。クライアントがメールを送信したか、その ID に関連する複雑なアクションを実行した可能性があります。

したがって、500 が返されるか、サーバーが状況の修正を試みて、必要に応じて可能な限り次の 1 つまたは複数を適用することができます。

  • しばらく待って (クライアントはまだ待機中です!)、リソースの再表示を確認します。
  • キャッシュをフラッシュするか、データベースを刺激してリソースを消費させてください
  • リソースを無効にする
  • リソースを削除します (明らかに存在しない場合でも)
  • エラーをログに記録し、詳細を管理者に送信します
  • 機能するまで、リソースの作成を指定された回数繰り返します (大きすぎないか、一時的な問題が自己サービス拒否に陥る可能性があります)。

合理的かつ許容できる (クライアントによる) 時間内に状況が修正された場合、作業リソースはコード 200 で返されます。

もちろん、上記のすべてが実際に起こった理由を調査して修正する必要があります。おそらく、一部の「孤立した」リソースをデータベースから定期的にパージする必要があるかもしれません (常に厄介な提案です)。

于 2012-12-05T23:18:51.303 に答える
1

あなたが述べるときあなたは間違っています:

応答は、リソースオブジェクトをJSONとして200にする必要があります。

応答はそうで201はなく200Location:ヘッダーを設定する必要があります。応答にリソース表現を含める必要はありません。それを含めたい場合、コードは次のようになります。

mysql_query('INSERT ...'); // succeeds
$id = mysql_insert_id(); // succeeds
$result = mysql_query('SELECT ...'); // times out

次に、本体なしで201を返します。クライアントは、必要に応じて、作成されたリソースの取得を再試行できます。

于 2012-12-06T14:47:02.173 に答える
1

作成されたエンティティを返す必要がないため、201 Createdを使用できます。クライアントがそれを取得しようとすると、.500 Server Error

サーバーの悪ふざけの可能性をクライアントに知らせたい場合は、non-committal であるため202 Accepted、 を返すことができます。

何をするにしても、このリソースを冪等にすることをお勧めします。これは、複雑な障害モードがあり、クライアントが作成を再試行する可能性が高いためです。

于 2012-12-05T23:33:12.307 に答える