RFC 2616,第 9.6 节,PUT:
POST 和 PUT 请求的根本区别体现在 Request-URI 的不同含义上。POST 请求中的 URI 标识将处理封闭实体的资源。该资源可能是一个数据接受进程,一个通往其他协议的网关,或者一个接受注释的单独实体。相比之下,PUT 请求中的 URI 标识了请求中包含的实体——用户代理知道 URI 的意图,服务器不得尝试将请求应用于其他资源。
和:
如果无法使用 Request-URI 创建或修改资源,则应给出反映问题性质的适当错误响应。
所以定义'合适'就是看400系列,说明有客户端错误。首先,我将消除不相关的:
- 400 Bad Request:由于语法错误,服务器无法理解该请求。
- 401 Unauthorized:请求需要用户认证。
- 402 需要付款:此代码保留供将来使用。
- 406 Not Acceptable:根据请求中发送的接受标头,请求标识的资源 [...] 不可接受。
- 407 Proxy Authentication Required:此代码 [...] 表示客户端必须首先通过代理验证自己。
- 408 Request Timeout:客户端在服务器准备等待的时间内没有产生请求。
- 411 Length Required : 服务器拒绝接受没有定义 Content-Length 的请求。
那么,我们可以使用哪些?
403 禁止
服务器理解请求,但拒绝执行。授权将无济于事,并且不应重复请求。
这个描述实际上非常适合,尽管它通常用于与权限相关的上下文中(例如:您可能不会......)。
404 未找到
服务器未找到任何与请求 URI 匹配的内容。没有说明这种情况是暂时的还是永久性的。如果服务器通过一些内部可配置的机制知道旧资源永久不可用并且没有转发地址,则应该使用 410 (Gone) 状态代码。当服务器不希望确切地揭示请求被拒绝的原因或没有其他响应适用时,通常使用此状态代码。
这个也是,尤其是最后一行。
405 方法不允许
Request-URI 所标识的资源不允许使用 Request-Line 中指定的方法。响应必须包含一个 Allow 标头,其中包含所请求资源的有效方法列表。
没有我们可以响应的有效方法,因为我们现在不希望在这个资源上执行任何方法,所以我们不能返回 405。
409 冲突
响应 PUT 请求时最有可能发生冲突。例如,如果正在使用版本控制并且被 PUT 的实体包含对资源的更改,这些更改与早期(第三方)请求所做的更改相冲突,则服务器可能会使用 409 响应来指示它无法完成请求. 在这种情况下,响应实体可能会以响应 Content-Type 定义的格式包含两个版本之间差异的列表。
但这假设在 URI 上已经有一个资源(怎么可能有冲突呢?)。
410 走了
请求的资源在服务器上不再可用,并且不知道转发地址。预计这种情况将被视为永久性的。具有链接编辑能力的客户端应该在用户批准后删除对 Request-URI 的引用。如果服务器不知道或无法确定条件是否是永久的,则应该使用状态代码 404(未找到)。
这个也有道理。
我已经编辑了这篇文章几次,当它声称“使用 410 或 404”时它被接受了,但现在我认为 403 也可能适用,因为 RFC 没有说明 403 必须与权限相关(但它似乎是由流行的 Web 服务器以这种方式实现的)。我想我已经消除了所有其他 400 个代码,但请随时发表评论(在您投反对票之前)。