是否允许使用 409 Conflict 状态码来防止在 HTTP PUT 请求中更新某些字段

Posted

技术标签:

【中文标题】是否允许使用 409 Conflict 状态码来防止在 HTTP PUT 请求中更新某些字段【英文标题】:Is it allowed to use the 409 Conflict status code to prevent some fields from being updated in a HTTP PUT request 【发布时间】:2016-11-23 22:36:00 【问题描述】:

在处理 (json) REST API 时,我遇到了这样一种情况,即我们有一个 user 资源的表示形式,我想防止在 PUT 中覆盖字段 (email)。如果我理解正确,那么 PUT 应该包含资源的完整表示来替换旧的。

因此,例如,从 API 获取用户时(为简单起见,省略了一些标头):

> GET /user/123 HTTP/1.1
> Host: example.com
> Authorization: Bearer XXXXX
> Accept: application/json

< HTTP/1.1 200 OK
< Content-Type: application/json
< 
<  "name": "John Smiht"
< , "email": "john.smith@example.com"
< 

如果你想修正 John Smiths 名字中的错字,你会这样做:

> PUT /user/123 HTTP/1.1
> Host: example.com
> Content-Type: application/json
> 
>  "name": "John Smith"
> , "email": "john.smith@example.com"
> 

< HTTP/1.1 201 No Content

现在,如果有人要输入不同的电子邮件地址,我是否可以使用 409 表示请求未处理?

> PUT /user/123 HTTP/1.1
> Host: example.com
> Content-Type: application/json
> 
>  "name": "John Smith"
> , "email": "something.else@example.com"
> 

< HTTP/1.1 409 Conflict
< Content-Type: application/json
<
<  "errorNumber": "XXX"
< , "errorMessage": "Not allowed to change e-mail address this way"
< 

根据https://www.rfc-editor.org/rfc/rfc2616

400 Bad Request 表示语法格式错误(这不是) 可以使用403 Forbidden,但在我看来,它更多的是访问整个资源,而不是其中的一部分 409 Conflict 似乎是关于无法满足请求的技术原因,而不是关于有特权做某事。

那么,我的问题是:我应该使用哪个状态码?


编辑:根据接受的答案;响应将变为

> PUT /user/123 HTTP/1.1
> Host: example.com
> Content-Type: application/json
> 
>  "name": "John Smith"
> , "email": "something.else@example.com"
> 

< HTTP/1.1 403 Forbidden
< Content-Type: application/json
<
<  "errorNumber": "XXX"
< , "errorMessage": "Not allowed to change e-mail address this way"
< 

【问题讨论】:

【参考方案1】:

我会说如果用户无权更改电子邮件地址 403 将是正确的代码,因为服务器理解用户但拒绝对其采取行动。 (通常意味着缺少范围/权限)

【讨论】:

好吧,我想我同意你的推理。接受它作为答案:-)

以上是关于是否允许使用 409 Conflict 状态码来防止在 HTTP PUT 请求中更新某些字段的主要内容,如果未能解决你的问题,请参考以下文章

drop_download 中的错误:冲突 (HTTP 409)

如何使用位掩码来允许/禁止某些位的操作

Sharepoint 2010 客户端对象模型 - 上传文档(409 冲突)

BigQuery Python 409 已经存在:表格

判断来防ip是否为蜘蛛

PUT 文件 returned a response status of 403 Forbidden