我正在尝试为我正在处理的网站的心愿单部分完成一个宁静的网址结构。这是一个非常简单的模型,用户可以拥有许多愿望清单,每个愿望清单可以包含许多产品。
目前我有明显的CRUD网址来操纵心愿单本身:
GET account/wishlists.json
GET account/wishlists/{id}.json
POST account/wishlists.json?name=My%20Wishlist
POST account/wishlists/{id}.json?name=My%20New%20Name
DELETE account/wishlists/{id}.json
但是,我认为我不知道如何构建将产品添加/删除到愿望清单的URL:(
以下是我目前的选择:
1)让产品作为网址的一部分添加,并使用HTTP动词来定义我的操作
POST account/wishlist/{id}/product/{product_id}.json
DELETE account/wishlist/{id}/product/{product_id}.json
或
2 )将操作作为URL的一部分,将产品ID作为有效负载的一部分
POST account/wishlist/{id}/add.json?product_id={product_id}
POST account/wishlist/{id}/remove.json?product_id={product_id}
(1)很干净,据我所知,它很漂亮但不允许轻松添加多个产品等等。
我也有点担心使用DELETE动词 - 我没有删除产品或心愿单,我只是从另一个中删除。
(2)更明确但是偏离了REST - 我不会只是引用url中的资源,我将指的是对该资源的操作:(
关于上述哪一项更正确的任何建议都会非常有帮助! (如果有第三个选项比我的更好,请随意纠正我!)
答案 0 :(得分:9)
(1)是REST的唯一有效方法,使用HTTP谓词进行操作。
(2)将方法名称编码为更像RPC的URI,当然不是RESTful。
关于第一种方法的缺点:
DELETE
动词很好,因为您的资源是心愿单中的项目,而不是项目本身。POST
一个项目列表到愿望清单资源,从而导致多个添加。PS:首选HTTP内容协商(Accept和Content-Type标头),而不是URI中编码的表示格式。
答案 1 :(得分:3)
我认为您的第一个选择更符合REST理念。如果要操作多个产品,可以将ID作为列表传递给正文,而不是使用查询参数。
至于删除部分,假设您正在删除心愿单的子资源,我认为意图是明确的(即删除了从心愿单到产品的连接)。如果您想要全局删除产品,则URL应该类似于
DELETE /products/{id}
答案 2 :(得分:1)
正如其他回复所指出的,第一种选择显然是RESTful方法。从愿望清单中删除产品的方法看起来很好 - 毕竟你要在DELETE
上product/{product_id}
删除产品本身。
对于添加产品,您可能希望考虑POST
到account/wishlist/{id}/product/
,其正文可能包含产品ID列表。
答案 3 :(得分:1)