30

ある種のコンテナにアイテムを追加する REST Web サービスを想像してみてください。たとえば、次のように出席者 #789 をイベント #456 に追加できるとします。

PUT http://..../api/v1/events/456/attendees/789

イベント #456 または出席者 #789 のいずれかが存在しない場合、HTTP 404 を (問題の内容を説明する詳細なエラー ペイロードと共に) 返すのは正しい{ "error" : { "message" : "Event 456 does not exist" , "code" : "404" } }ですか?

同様に、別のオブジェクトを参照する新しいものを作成しようとしているが、別のオブジェクトが存在しない場合はどうなるでしょうか? たとえば、場所 #123 でイベントを作成しているとします。

PUT http://..../api/v1/event
{ "location": 123, "name": "Party", "date": "2012-05-23", ...etc... }

ロケーション #123 が存在しない場合、404 を返すのも正しいですか (応答の詳細と共に)? そうでない場合、どれが適切でしょうか? 400 だけですか?

HTTP 1.1 仕様によるとhttp://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

9.6 PUT ... Request-URI でリソースを作成または変更できなかった場合、問題の性質を反映した適切なエラー応答を与える必要があります。

したがって、404 で応答するのは良い投票のように思えます。 ただし、何らかの理由で、PUT (または POST) に 404 で応答するのは奇妙に思えます...おそらく、404 が意味するためです。リソースが見つからないことを示していますが、この場合、リソースは実際には他の 2 つのリソース間のリンクであり、見つからない 2 つのリソースの 1 つです。

ここでの私の正確な例についてあまり心配しないでください。それらは要点を説明するために作られています。主な質問は、リンクされたリソースが見つからないために失敗した PUT 操作に対する 404 応答は適切かということです。

参考文献を示していただけると助かります。このレベルの詳細に達し、十分に信頼できるものを見つけるのに苦労しています。特に、REST API 設計におけるリソース関係の処理に関して。

おそらく最初の例では 404 が返され、2 番目の例では返されないはずだと考えていますこれは、最初のケースでは、追加するリソースがイベント 456 と出席者 789 を複合主キーとして使用するためです。2 番目のケースの場所は、外部キーのみです。2 番目のケースでは、エラーが返されますが、404 は返されません。おそらく 412 Precondition Failed または単に 400 Bad Request です。考え?

4

1 に答える 1

21

多くの 4xx HTTP ステータス コードがあります。最も可能性が高いのは 404 または 409 のいずれかです。

404お探しのページが見つかりませんでした

サーバーは有効なリクエスト URI に一致するものを見つけられませんでした。状態が一時的なものか永続的なものかは示されていません。410 (Gone) ステータス コードは、古いリソースが永続的に利用できず、転送アドレスがないことを内部で構成可能なメカニズムを通じてサーバーが認識している場合に使用する必要があります。このステータス コードは、サーバーが要求が拒否された理由を正確に明らかにしたくない場合、または他の応答が適用できない場合に一般的に使用されます。

409 紛争

リソースの現在の状態と競合するため、要求を完了できませんでした。このコードは、ユーザーが競合を解決してリクエストを再送信できると予想される状況でのみ許可されます。応答本文には、ユーザーが競合の原因を認識するのに十分な情報を含める必要があります。理想的には、応答表現には、ユーザーまたはユーザー エージェントが問題を解決するのに十分な情報が含まれます。ただし、それは不可能な場合があり、必須ではありません。

競合は、PUT 要求への応答で発生する可能性が最も高くなります。たとえば、バージョニングが使用されていて、PUT される表現に、以前の (サードパーティの) 要求によって行われたものと競合するリソースへの変更が含まれていた場合、サーバーは 409 応答を使用して、要求を完了できないことを示す可能性があります。 . この場合、応答表現には、2 つのバージョン間の相違点のリストが含まれている可能性があります。

404 はURI が見つからない場合に使用されますが、409 はリソースの現在の状態が要求された操作を許可していないことを示します。あなたの場合、それを許可しない何かが間違っているため、要求を満たすことができません。

于 2012-05-23T21:26:44.527 に答える