说我想写一个界面,公开用户已读过的一套书。由于我希望URI是人类可读的,因此它们的格式为/books/War-and-Peace
。将一本书添加到集合似乎是一个PUT操作,因为它1)创建一个新资源,2)是幂等的,因为一个集合不能有重复的元素。但是,PUT方法要求客户端知道要创建的资源的URI,在这种情况下必须在服务器上计算,因为可能有多个具有相同标题的书籍,这些书籍将表示为{{1} }和/books/War-and-Peace
。当然,一个hacky解决方案是使用POST,允许创建新资源,但不保证是幂等的。
我的解决方案如下:
/books/War-and-Peace-2
,其中/book-hashes/<hash>
是图书对象的哈希值。<hash>
。/books/<title>
的其他状态代码。/books/<hash>
。/book-hashes/<hash>
。/books/<title>
并将其存储为图书资源的新URI。/books/<title>
。这是一个合法的REST解决方案吗?有没有人以不同的方式解决问题?
答案 0 :(得分:3)
在这里使用POST没有任何问题。 POST通常用于“添加”事物,然后返回所创建资源的URI。
所以
POST /books?title=War-and-Peace
303
Location: /books/War-and-Peace-2
答案 1 :(得分:0)
怎么样?
GET /BookSlug?title=War%20and%20Peace
=>
200 OK
Content-Type: text/plain
war-and-peace
接着是
PUT /Book/war-and-peace
<BookContent>
=>
201 Created