質問: RESTfulなWebサービスにおいて「指定したIDでリソースを新規作成するか、既に存在するのであればエラーとしたい」という場合どうするのが一般的でしょうか。 といった受け答えをしたい場合です。 以下のようなものを考え、それぞれ疑問点を付記しました。 1. POST /user/foo RFC2616 によると「新しい従属{subordinate} として、リクエストに同封されるエンティティを受け入れる事を要求する」とあり、新規作成はコレクションリソース (この場合 users) にすべきなのでしょうか。 2. POST /users (POSTパラメータとしてid=foo) そもそもPOSTで作成するリソースのIDを指定してもいいのでしょうか。 3. PUT /user/foo 重複IDをエラーとするので、リソースを更新できないことになってしまいます。 4. PUT /user/foo?new=on パラメータを付記することで、「既にリソースが存在する場合はエラーにして欲しい」とするものです。 べき等性のを考えると疑問があります。 既存のパターンや落とし所などあれば教えていただきたいです。 よろしくお願いします。
回答: RESTfulなWebサービスというのはオープンな(インターネットに対して開かれた)サービスのことで、リソースというのがファイルシステム上のサブディレクトリやファイル、またはデータベースの物理テーブルのようなものを生成するという意味であれば、そもそも論として、POSTでリソースを新規作成指示してはなりません。 というのは、サイバー攻撃として新規リソース作成要求をかけられてしまうと、Webシステムに膨大な負荷がかかるためです。 オープンなWebサービスにおいて新規リソース作成要求をかけたいなら、SSL通信が大前提です。 次に、クライアント証明書を送るなり、OAuthを利用するなりして、クライアント認証を行う必要があります。 ここまでクリアしたら、あとはPOSTでIDを送ることになります。リソースIDの範囲が "foo" だけなら、ご質問にある2の方法が妥当でしょう。リソースが存在したらエラーを返すのが前提の処理なら、4にするのは回りくどい気がします。