Http RESTURL结构建议
我正试图为我正在工作的网站的愿望列表部分最终确定一个restful url结构。这是一个非常简单的模型,一个用户可以有许多愿望列表,每个愿望列表可以包含许多产品 目前,我有明显的CRUD URL来操纵愿望列表本身:Http RESTURL结构建议,http,url,rest,Http,Url,Rest,我正试图为我正在工作的网站的愿望列表部分最终确定一个restful url结构。这是一个非常简单的模型,一个用户可以有许多愿望列表,每个愿望列表可以包含许多产品 目前,我有明显的CRUD URL来操纵愿望列表本身: GET account/wishlists.json GET account/wishlists/{id}.json POST account/wishlists.json?name=My%20Wishlist POST account/wishlists/{id}.json?nam
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) 是干净的,据我所知,它是相当安静的,但不允许像添加多个产品容易等事情
我也有点担心使用删除动词-我不是在删除产品或愿望列表,我只是从另一个中删除一个
(2) 更显式,但与REST不同-我不仅仅指url中的资源,我指的是对该资源的操作:(
任何关于以上哪一个更正确的建议都会非常有用!(如果有第三个选项比我的更好,请随意更正!)(1)是REST的唯一有效方法,使用HTTP动词进行操作
(2) 将方法名编码到URI中,URI更像RPC,当然不是RESTful
关于第一种方法的缺点:
动词可以,因为您的资源是愿望列表中的项目,而不是项目本身DELETE
- 您可以支持批处理请求。例如,您可能希望允许
将项目列表发布到愿望列表资源,从而导致多个添加POST
PS:与URI中编码的表示格式相比,您更喜欢HTTP内容协商(接受和内容类型标题)。我认为您的第一个选项更符合REST原理。如果您想要操作多个产品,您可以将ID作为列表传递到正文中,而不是使用查询参数 至于删除部分,鉴于您正在删除wishlist的子资源,我认为其意图是明确的(即删除wishlist与产品的连接)。如果您希望全局删除产品,URL应该类似于
DELETE /products/{id}
正如其他回复所指出的,第一种选择显然是RESTful方法。从愿望列表中删除产品的方法看起来不错——毕竟,您将在
product/{product_id}
上执行DELETE
来删除产品本身
对于添加产品,您可能希望考虑<代码> POST <代码> >代码>帐户/ WISHIST/{ID}。/product/其主体可能包含一个产品ID列表。
关于如何考虑REST url关于内容协商等,我希望允许用户发送任何内容,无论是标题还是url扩展;在我的示例中,编写.json最简单;)好的,刚刚无意中发现了您的示例,并想提及它:-)@deanWombourne@PartlyCloudy我认为.format
有权明确要求以特定格式返回,因为在接收头的情况下,服务器决定最终发送哪种格式。但是,如果没有可用的JSON响应(在您的示例中),或者用户要求提供不可提供的格式(.xml,当您只有JSON时),则必须返回404 not Found标头,而不是提供替代表示。@SamuelHerzog nothing强制服务器注意URI中的格式。我认为URI中的格式唯一有意义的时候是当人们将URI输入到web浏览器中时,因为(目前)手动设置标题太繁琐了。默认情况下,通过标题进行内容协商。如果无法处理这种格式,服务器仍然可以返回适当的响应。@在构建API时,管理员您的主要兴趣应该是您的用户/消费者-这就是我们首先需要REST的原因。我认为,如果你让消费者有可能要求一个明确的格式(允许像URI这样的文件系统),你就需要正确处理内容:如果消费者要求一个XML文件,你需要提供XML或告诉用户它不可用。如果您的客户能够协商内容,他就有办法对文件格式的更改做出反应。如果你公开了一个带有“文件结尾”的API,你就不能再依赖它了,需要用404状态码来做出反应。对于完整的答案来说太懒了,但要清楚一点,选项二决不能被认为是REST,因为你在URI中有一个动作。