Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http RESTURL结构建议_Http_Url_Rest - Fatal编程技术网

Http RESTURL结构建议

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

我正试图为我正在工作的网站的愿望列表部分最终确定一个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?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中有一个动作。