REST PUT在URI中不加key,而是把key放在body里面可以吗?

问题描述 投票:0回答:1

我正在设计一个REst API,我们的后台资源对象有一个组合作为key,比如account_number+product_type。

我设计的是REst API,我们的后台资源对象有一个组合作为key,比如账号+产品类型,这样的PUT是否可以更新一个账号,用thisPUT: accounts_number+product_type。

{

account_number:1222;

product_type:sn,

;;;;

}

我知道标准的PUT方式是在URI中引用key,只是想知道如果没有key会不会出现什么问题?

rest restapi
1个回答
2
投票

PUT更新一个账户是否可以,用这个PUT: accounts

潜在的问题是,请求的意思并不是你认为的那样。

REST架构风格中的一个约束条件是统一接口约束,大体上,这意味着大家对请求的理解是一样的。

PUT,在HTTP中的定义是:用http请求的消息体所包含的表示方式替换目标资源的状态。 参见 RFC 7231

一个给定表示的成功PUT将表明,随后对同一目标资源的GET将导致一个等价的表示以200(OK)的响应方式发送。

换句话说,当您创建一个请求,如

PUT  /accounts

{ "account_number":1222, ...

你的意思是说,当有人发送一个 GET /accounts 请求。

从你的问题来看,你可能想要的是,离开了 /accounts 不变,而实际上是在做改变。/accounts/1222 资源。 但这不是 这个 请求说。

真正的危险不是你的服务器会做错事--你控制着你的服务器,而服务器在响应请求时有很大的自由度。

真正的危险是其他通用组件会做错事,因为它们会相信消息的意思是它所说的意思,而不是只有你的服务器才理解的其他东西。

如果由此产生的混乱导致财产损失,每个人都会(正确地)责怪你的服务器对消息语义的不正确解释。

我们说的是什么样的混乱呢? 规范的 204 没有内容 提供了一个提示:客户端(以及任何其他通用组件)被允许假设204响应中包含的元数据适用于该 目标资源的资源;在这个例子中,元数据将被应用于 /accounts 而非 /accounts/1222.

当然,这样的设计是有问题的,这个故障可能会导致失败,也可能不会导致失败。

在我维护的一个项目中,当我发现这个故障时,我会立即拒绝一个拉取请求。 这和无谓的破坏后向兼容性是一样的。

© www.soinside.com 2019 - 2024. All rights reserved.