在网址和正文中输入ID时,哪一个获胜?

时间:2018-12-12 19:37:02

标签: rest http get put

在以下情况下尝试找出正确的宁静行为:

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

这些对我而言具有吸引力的选项是降序排列:

  • PUT上的状态不正常-发出冲突信号,并且不允许PUT
  • 首先不要在对象中包含id问题:我的对象可能真的很复杂,并且将id编织到它们的嵌套结构中,使得再次过滤/分解变得困难
  • URL ID获胜(忽略正文ID)。 问题:再次获取时,我不知道输入的内容,而是其他东西
  • 全胜。 问题:我输入的内容完全消失在其他地方

1 个答案:

答案 0 :(得分:3)

RFC 7231

  

对给定表示形式的成功PUT建议,在同一目标资源上进行后续GET将导致在200(OK)响应中发送等效表示形式。

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

GET /objects/1

200 OK

{ "id": 2 }

就HTTP而言,这是完全有效的,就像它用于

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

200 OK

{ "id": 2 }

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

  

原始服务器应验证PUT表示是否与服务器对目标资源的任何约束一致,而该约束不能由PUT更改,也不会由PUT更改。

完全可以说,从PUT/fbb477c8-e2f3-4581-9c44-27305de6ebee的任何表示都必须约为id:1,并且拒绝不一致的请求,这些请求不能满足该不变性。 409 Conflict是这种情况下常用的状态代码。

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