人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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
パラメータを付記することで、「既にリソースが存在する場合はエラーにして欲しい」とするものです。
べき等性のを考えると疑問があります。

既存のパターンや落とし所などあれば教えていただきたいです。
よろしくお願いします。

●質問者: taketyan
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● oil999
●100ポイント

RESTfulなWebサービスというのはオープンな(インターネットに対して開かれた)サービスのことで、リソースというのがファイルシステム上のサブディレクトリやファイル、またはデータベースの物理テーブルのようなものを生成するという意味であれば、そもそも論として、POSTでリソースを新規作成指示してはなりません。
というのは、サイバー攻撃として新規リソース作成要求をかけられてしまうと、Webシステムに膨大な負荷がかかるためです。

オープンなWebサービスにおいて新規リソース作成要求をかけたいなら、SSL通信が大前提です。
次に、クライアント証明書を送るなり、OAuthを利用するなりして、クライアント認証を行う必要があります。
ここまでクリアしたら、あとはPOSTでIDを送ることになります。リソースIDの範囲が "foo" だけなら、ご質問にある2の方法が妥当でしょう。リソースが存在したらエラーを返すのが前提の処理なら、4にするのは回りくどい気がします。


taketyanさんのコメント
ありがとうございます。 前半の件については、Web サービスといってもクローズドなものなので問題無いです。 社内のサービスから使用される共通の Web API で、SSL 接続を前提としています。 認証については、社内からしか使われない前提なので、パラメータを利用した簡単な認証を行っています。 2 が妥当、4 は回りくどい、というご意見ありがとうございます。 参考にさせていただきます。

2 ● tkawa
●200ポイント ベストアンサー

結論から言うと、2か3がよく、1や4も場合によってはOKだ思います。

一般的には、URLをサーバが決定する場合はPOST、クライアントが決定する場合はPUTと言われています(Webを支える技術 p.95)。
それに従うならばこの場合はPUTで 3 ということになります。PUTでリソースの更新を許すかどうかというのは、新規作成できるユーザと、更新できるユーザは権限が異なるという認証や認可(権限)の問題なので、適切に設計すれば大丈夫でしょう。
ステータスコードは、成功なら201、失敗なら権限なしということで401/403になります。(更新成功なら200)

新規作成と更新の操作を明確に区別したいということであればPOSTで 2 でもいいと思います。パラメータでURL(の一部)を指定することは問題ありません。
この場合、成功なら201、失敗なら409ですかね。

4 に関しては、If-None-Match: * というリクエストヘッダが相当します。リソースが存在しなければ実行しろという意味になります。この場合は失敗すると412となります。ある意味ではこれが一番RESTfulかも。

自分が実装するとしたら、他の条件にもよりますが単純に 2 にすると思いますね。

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ