(思索)RESTでID変更

/{collection} 
/{collection}/{id} 

といったパスで参照可能なRESTfulなリソース群があったとしよう。
さて、ここであるリソース、例えば/books/123のIDを456に変えたいとしたら、どうするのが美しいのか?

  1. PUTでやる
  2. リソースを消して創りなおす。

いまさらだが、今、こういう問題に直面して明確な答えが自分の中にないことに気付いた。

前者は、即ち例えば、/books/123 に対して {"id":"456, "foo":"bar"} などといったBODYでPUTリクエストを出すということで、その結果/books/123は参照不可能となり/books/456という新しいリソースができるということだ。これはさすがにRESTfulじゃない気がする。そもそもこの処理に対するレスポンスコードは201か?新しいリソースのURLはLocationヘッダで送るのか? なんて考えるとますますあやしい。。。ような気もしつつ、それはまだましだけど、やっぱり/books/123にPUTしたのに/books/123が消えるというのが最悪な感じ。

ということで、ID変更はリソースを消して創りなおすべし! というのを私の答えとしたいと思う。

導き出されること

では、IDを変更しろという内容のPUTリクエストを受け付けたらどうすべきか。
エラーを返すか、無視すべきということとなる。
たしかに実際、CouchDBでGETで返ってきたデータの"_id"を変更してPUTするとすんなり無視される。なるほど。

無視がいいかというと、できればエラーを返してあげるほうが正しい気がする。ではどんなステータスコードがいいか。409あたりかな?