ある種のコンテナにアイテムを追加する 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 です。考え?