宁静的网址在查询字符串或请求体数据?(Restful URLs with data in query

2019-09-01 01:34发布

什么是拇指在查询字符串中REST URL将数据传递与一个请求主体的规则?

即:你创建一个服务添加曲棍球运动员。 你可以一起去:

PUT /players 
{ "name": Gretzky }

要么

PUT /players?name=Gretzky

如果你传递大量的数据,你需要去与选项#1,因为是对URL长度的限制。 但除此之外,为什么不直接使用查询字符串来传递数据?


更新 :删除,你可以测试选项#2在浏览器中注释。 实现(杜),你只能做GET-S在您的浏览器。

Answer 1:

基于PUT的HTTP的定义,你的第一个请求被覆盖的玩家只包含一个球员的名字一个新的列表清单。 它是不会增加的球员名单。

第二个选项并没有真正多大意义了我。 这样做PUT没有主体未与PUT的意思真的是一致的。

考虑到POST的标准定义之一是要附加到现有的资源,我不知道为什么你不会做

POST /players 
{ "name": Gretzky }

如果你确信你球员的名字都将是独一无二的,那么你可以使用PUT这样的:

PUT /player/Gretzky
{ "name": Gretzky }

当你决定做HTTP REST您同意在在RFC2616中定义的方式来使用HTTP。 这是统一接口约束的意思。 而刚刚成为迂腐,有一个REST URL没有这样的事情,你不能因为没有测试的JavaScript在浏览器中任一选项,你不能在浏览器中PUT。



Answer 2:

选项1是好的,但可能是矫枉过正。 选项#1,因为它不是幂精。

选项#2是一个主意。 这将是滥用PUT。 PUT应主要用于当请求数据有效载荷是数据的不透明块,通常是或大或分层的。 小,不分层有效载荷更有意义的POST。

另外,尽量避免通过查询参数改变状态。 没有什么技术上的危险有关,如果它不是一个GET请求,但它不是真正的REST风格。

在这种情况下,你应该做的是:

POST /players HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 12

name=Gretsky

这应该返回一个201 Created响应。 (这里有一个例外:如果你不立即创建资源,它可能会在以后的时间被拒绝,使用202 Accepted代替。)

编写使用多个HTTP POST相比并获得应该只在读完做了REST Web服务的HTTP规范 。 (这是一个非常有用的阅读。)这条规则是有点宽松的,如果你使用了一个框架,使所有的决定为您服务。



Answer 3:

我的REST操作的理解是,URL唯一标识的资源,而请求的主体包含资源的代表性。 鉴于这种情况,这是有问题的要么你的选择是否是真正的RESTful。

第一是,假设资源被命名为“玩家”,并在该资源的GET返回的球员名单(我不会进入的不管是GET回报等资源的URL或不是问题...菲尔丁会说它应该与单个请求获取资源数据)。

第二是,假设请求正文包含在由名称“Gretsky”键控信息。 然而,这需要你在外部生成密钥。



Answer 4:

使用应查明资源在身上,无论是路径组件或查询参数,但我宁愿路径组件像一个名称或ID的URL。 主体应该是一个表示; 你把一个应该相同或当你从同一个URL得到什么相似(或可以得到的,在多种格式的情况下)

实例#1,因为你发送一个单人表示,为使所有玩家网址是不合适的。 POST会在这种情况下更合适。

如果扩展到所有领域,因为你会然后是网址发送表示数据例2,会有些不恰当。



文章来源: Restful URLs with data in query string or request body?