Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rest 资源已存在时POST的HTTP响应代码_Rest_Http_Http Status Codes - Fatal编程技术网

Rest 资源已存在时POST的HTTP响应代码

Rest 资源已存在时POST的HTTP响应代码,rest,http,http-status-codes,Rest,Http,Http Status Codes,我正在构建一个允许客户端存储对象的服务器。这些对象完全在客户端构建,并带有对象ID,这些ID在对象的整个生命周期中都是永久的 我已经定义了API,以便客户端可以使用PUT创建或修改对象: PUT /objects/{id} HTTP/1.1 ... {json representation of the object} {id}是对象id,因此它是请求URI的一部分 现在,我还考虑允许客户端使用POST创建对象: POST /objects/ HTTP/1.1 ... {json repr

我正在构建一个允许客户端存储对象的服务器。这些对象完全在客户端构建,并带有对象ID,这些ID在对象的整个生命周期中都是永久的

我已经定义了API,以便客户端可以使用PUT创建或修改对象:

PUT /objects/{id} HTTP/1.1
...

{json representation of the object}
{id}是对象id,因此它是请求URI的一部分

现在,我还考虑允许客户端使用POST创建对象:

POST /objects/ HTTP/1.1
...

{json representation of the object, including ID}

由于POST的意思是“追加”操作,所以我不确定在对象已经存在的情况下该怎么做。我应该将请求视为修改请求还是返回一些错误代码(哪一个)?

我的感觉是
409冲突
是最合适的,当然,在野外很少见到:

由于与资源的当前状态冲突,无法完成请求。只有在预期用户可能能够解决冲突并重新提交请求的情况下,才允许使用此代码。响应主体应包含足够的信息,以便用户识别冲突的来源。理想情况下,响应实体将包括足够的信息,供用户或用户代理修复问题;然而,这可能是不可能的,也不是必须的

在响应PUT请求时最有可能发生冲突。例如,如果正在使用版本控制,并且正在放置的实体包含对资源的更改,这些更改与先前(第三方)请求所做的更改相冲突,则服务器可能会使用409响应来指示它无法完成请求。在这种情况下,响应实体可能会以响应内容类型定义的格式包含两个版本之间差异的列表


我个人使用WebDAV扩展
422不可处理实体

422不可处理实体
状态代码意味着服务器理解请求实体的内容类型(因此
415不支持的媒体类型
状态代码不合适),并且请求实体的语法正确(因此
400错误请求
状态代码不合适)但无法处理包含的指令

“302找到”听起来很符合逻辑。该网站还表示,除了GET和HEAD之外,还可以回答其他请求(这当然包括POST)

但它仍然让访问者通过RFC访问此URL以获取此“已找到”资源。要让它直接进入真正的“找到的”URL,应该使用“303查看其他”,这是有道理的,但会强制另一个调用获取其下面的URL。从好的方面来说,这个GET是可以缓存的

我想我会使用“303查看其他”。我不知道我是否可以用在正文中找到的“thing”来回应,但我想这样做是为了节省到服务器的一次往返


更新:在重新阅读RFC后,我仍然认为不存在的“4XX+303已找到”代码应该是正确的。但是,“409冲突”是最好的现有答案代码(正如@Wrikken所指出的),可能包括指向现有资源的位置头。

我认为您不应该这样做

正如您所知,POST用于修改集合,并用于创建新项。因此,如果您发送id(我认为这不是一个好主意),您应该修改集合,即修改项目,但这会让人困惑

使用它添加一个没有id的项目。这是最佳做法

如果希望捕获唯一约束(而不是id),可以响应409,就像在PUT请求中一样。但不是身份证。

208-?这是一种选择吗


在我看来,如果唯一的问题是重复资源,那么就不应该提出错误。毕竟,无论是客户端还是服务器端都没有错误。

另一种可能的治疗方法是使用补丁。补丁被定义为改变内部状态的东西,不限于附加


修补程序将通过允许您更新现有项目来解决此问题。请参阅:

游戏可能很晚了,但我在尝试制作RESTAPI时偶然发现了这个语义问题

要对Wrikken的答案进行进一步的阐述,我认为您可以根据情况使用
409冲突
403禁止
——简言之,当用户完全无法解决冲突并完成请求时,使用403错误(例如,他们不能发送
DELETE
请求来明确删除资源),或者如果可能的话,使用409

服务器理解该请求,但拒绝满足该请求。 授权无效,不应重复该请求。如果 请求方法不是HEAD,服务器希望公开 为什么请求未得到满足,应说明原因 用于实体中的拒绝。如果服务器不希望 此信息可供客户端使用,状态代码为404(不适用) 找到)可以改为使用

现在,有人说“403”,于是想到了权限或身份验证问题,但规范说,基本上是服务器告诉客户端它不会这样做,不要再问了,这就是为什么客户端不应该这样做

至于
PUT
vs.
POST
POST
应用于在用户无法或不应为资源创建标识符时创建资源的新实例。
PUT
用于已知资源标识时

POST和PUT请求之间的根本区别是 反映在请求URI的不同含义中 POST请求标识将处理所附请求的资源 该资源可能是一个数据接受进程,一个访问的网关 其他协议,或
100 Continue
101 Switching Protocols
102 Processing
200 OK
201 Created
202 Accepted
203 Non-authoritative Information
204 No Content
205 Reset Content
206 Partial Content
207 Multi-Status
208 Already Reported
226 IM Used
300 Multiple Choices
301 Moved Permanently
302 Found
303 See Other
304 Not Modified
305 Use Proxy
307 Temporary Redirect
308 Permanent Redirect
400 Bad Request
401 Unauthorized
402 Payment Required
403 Forbidden
404 Not Found
405 Method Not Allowed
406 Not Acceptable
407 Proxy Authentication Required
408 Request Timeout
409 Conflict
410 Gone
411 Length Required
412 Precondition Failed
413 Payload Too Large
414 Request-URI Too Long
415 Unsupported Media Type
416 Requested Range Not Satisfiable
417 Expectation Failed
418 I’m a teapot
421 Misdirected Request
422 Unprocessable Entity
423 Locked
424 Failed Dependency
426 Upgrade Required
428 Precondition Required
429 Too Many Requests
431 Request Header Fields Too Large
444 Connection Closed Without Response
451 Unavailable For Legal Reasons
499 Client Closed Request
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
505 HTTP Version Not Supported
506 Variant Also Negotiates
507 Insufficient Storage
508 Loop Detected
510 Not Extended
511 Network Authentication Required
599 Network Connect Timeout Error