rest - 当在 URL 和正文中使用 id 进行 PUT 操作时,哪一个获胜?

标签 rest http get put

尝试找出以下情况下正确的休息行为:

  • 有一个端点/objects/{id},其方法为 GET 和 PUT
  • 对象可以是任意 json,并且由于某种原因它们有自己的 id 作为键,例如{"id": 1}
  • GET/objects/1 上,我显然应该 revceive {"id": 1}
  • 当我 PUT/objects/1 {"id": 2} 时会发生什么?

这些是对我来说有吸引力的选项(按降序排列):

  • PUT 状态不正常 - 发出冲突信号并不允许 PUT
  • 首先不要在对象中包含 id问题:我的对象可能非常复杂,并且将 id 编织到其嵌套结构中,使得很难再次过滤掉/因素
  • URL ID 获胜(忽略正文 ID)。 问题:再次获取时,我没有得到我放入的内容,而是得到了其他内容
  • body 获胜。 问题:我放入的内容最终完全出现在其他地方

最佳答案

RFC 7231

A successful PUT of a given representation would suggest that a subsequent GET on that same target resource will result in an equivalent representation being sent in a 200 (OK) response.

资源的标识符及其表示形式不需要以任何语义上有意义的方式一致,就像文件的完全限定路径不需要与其内容一致一样,字典中的值不需要与其键一致。

GET /objects/1

200 OK

{ "id": 2 }

就 HTTP 而言,这是完全有效的,就像它一样

GET /fbb477c8-e2f3-4581-9c44-27305de6ebee

200 OK

{ "id": 2 }

您需要依赖的标准的关键部分是:

An origin server SHOULD verify that the PUT representation is consistent with any constraints the server has for the target resource that cannot or will not be changed by the PUT.

完全符合规则,任何 PUT/fbb477c8-e2f3-4581-9c44-27305de6ebee 的表示都必须是关于 id:1,并拒绝不满足该不变量的不一致请求。 409 Conflict是在这种情况下使用的常用状态代码。

当然,标识符 /objects/1 也是如此。

关于rest - 当在 URL 和正文中使用 id 进行 PUT 操作时,哪一个获胜?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53750201/

相关文章:

http - 如何在 Active Directory 中使用 NTLM 身份验证

angular - Http.get() 在 Ionic 4 的构建(发布/调试)中工作但不工作

post - 如何确定TCP/IP中上传+下载的总数据量

python - 如何请求 HTML 中多重选择的所有元素?

java - JAX-RS - Wink - 使用 Wink 客户端读取文件的正确方法

javascript - Ember 未检测到服务器响应中的所有属性

asp.net - ASP .Net Web API以二进制形式下载图像

java - Jersey 实现的 Web 服务中的缓存

http - 200 是表示请求成功启动还是成功完成?

php - 如何同时获取和发布方法