0

これまでのところ、冪等性を理解する方法は基本的に次のとおりです。10 個の同一の PUT をサーバーに送信すると、結果として作成される追加のリソースは、単一の PUT ステートメントを送信した場合と同じになります。

私がこれを意味するのは、次の実装がこれに準拠するということです。

[AcceptVerbs(HttpVerbs.Put)]
ContentResult User(){

     //parse XML that was sent to get User info
     //User has an e-mail address which is unique to the system
     //create a new user in the system only if one for this e-mail address does not exist

     return Content(something, "text/xml");
}

ここで、ユーザー データの XML を含む 10 個の PUT を送信し、それらすべてに同じ電子メール アドレスが含まれている場合、作成されるユーザーは 1 人だけです。

しかし、(なんらかの理由で) 10 件の要求を送信し、それらはすべて異なっていても、電子メールは同じである場合はどうなるでしょうか。最初のリクエストが成功しなかった場合、2 番目のリクエストのデータを使用してユーザーが作成され、その後の 8 つのリクエストは無視されます。ここに欠陥はありますか?それとも、あらゆる点で明示的に同一の要求を文字通り無視するだけで、代わりに、同じ電子メール アドレスを使用している場合、ユーザーが既に存在するというエラーを送り返す必要がありますか?

また、そのような PUT ステートメントからどのような応答を送信する必要がありますか? ユーザーに関する情報?他の API 呼び出しでそれらを操作するための ID でしょうか。それとも、単に「成功」​​または「失敗: [エラーの詳細]」と表示する必要がありますか?

4

2 に答える 2

2

Your question doesn't reveal the URL where the PUT request is sent to. This is actually very important as it is not the email address within the XML data that dictates whether a new resource is created or an old one updated but the URL that you are sending the request to.

So, if you send PUT to /users/jonh.doe@foo.com/ it either creates the user john.doe@foo.com or updates it if it was already in the system.

Similaraly, if you send PUT to /users/123/ (using id instead of email) it will create or update user 123. However, in this case if the email has to be unique and somebody sends PUT /users/456/ and within that XML is the same email as what the user 123 already has, you have to respond with 409 Conflict.

于 2011-06-07T22:19:23.323 に答える
0

ユーザーが同じ電子メールアドレスで既に存在する場合、2回目以降のPUT操作でそのリソースのデータを更新する必要があります。成功または失敗は、ステータスコードで通知する必要があります。更新が成功した場合は、「200OK」または「204コンテンツなし」で応答します。一部の情報を返すことはできますが、GETから取得する新しい表現であるかのようにキャッシュに情報が格納されることを期待しないでください。そのリソースが最初の操作以外のPUT操作を受け入れることを意図していない場合は、代わりに「405メソッドは許可されていません」と応答本文に説明を付けて応答してください。送信された表現がリソースを置き換える可能性があるが、それができないためにできない場合は、「409 Conflict」を使用します(ここでも、応答本文に説明があります)。

于 2011-06-07T21:53:34.243 に答える