问题描述
|
假设我想编写一个界面,公开用户已阅读的书集。由于我希望URI对人类可读,因此它们的格式应为“ 0”。将书籍添加到集合中似乎是一项PUT操作,因为它1)创建了新资源,并且2)是幂等的,因为集合中不能有重复的元素。但是,PUT方法要求客户端知道要创建的资源的URI,在这种情况下,必须在服务器上计算该URI,因为可能有多个书具有相同的标题,分别表示为“ 0”和“ 2”。当然,一种有问题的解决方案是使用POST,它可以创建新资源,但不能保证是幂等的。
我的解决方案如下:
客户端将PUT设置为
/book-hashes/<hash>
,其中<hash>
是书本对象的哈希。
服务器在该URI和/books/<title>
处创建对该对象的引用。
服务器发出303 See Other状态代码,指向ѭ6status。
客户端获得/book-hashes/<hash>
。
服务器以301永久移动作为响应,指向/books/<title>
。
客户端获取/books/<title>
并将其存储为书籍资源的新URI。
服务器删除“ 3”。
这是合法的REST解决方案吗?有谁以不同的方式解决了这个问题?
解决方法
怎么样?
GET /BookSlug?title=War%20and%20Peace
=>
200 OK
Content-Type: text/plain
war-and-peace
其次是
PUT /Book/war-and-peace
<BookContent>
=>
201 Created
, 在这里使用POST没什么错。 POST通常用于“添加”事物,然后返回创建的资源的URI。
所以
POST /books?title=War-and-Peace
303
Location: /books/War-and-Peace-2