我正在尝试为我正在努力的网站的心愿单部分完成一个宁静的网址结构.这是一个非常简单的模型,用户可以拥有许多愿望清单,每个愿望清单可以包含许多产品.
目前我有明显的CRUD URL来操纵心愿单本身:
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)让产品作为URL的一部分添加,并使用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中的资源,我将指的是对该资源的操作:(
关于上述哪一项更正确的任何建议都会非常有帮助!(如果有第三个选项比我的更好,请随意纠正我!)
(1)是REST的唯一有效方法,使用HTTP动词进行操作.
(2)将方法名称编码到URI中,它更像RPC,当然不是RESTful.
关于第一种方法的缺点:
该DELETE
动词是好的,因为你的资源是内部的心愿,而不是项目本身的项目.
您可以支持批量请求.例如,您可能希望允许将POST
一个项目列表添加到wishlist资源,从而产生多个mutliple.
PS:首选HTTP内容协商(Accept和Content-Type标头)在URI中编码的表示格式.