424 Failed Dependency
用法
424 Failed Dependency 错误是 WebDAV 的一部分,WebDAV 被用作基于 HTTP 的文件系统。收到此错误时,该状态码会作为 207 Multi-Status 响应的一部分出现在消息体中。这是一个成功响应中包含失败指示的示例。
客户端负责解析多状态响应,并在发现 424 Failed Dependency 错误时判断问题所在并相应解决。
此状态出现在 PROPPATCH 操作期间,即在单个 HTTP 请求中同时修改多个属性。通常,一个 HTTP 请求要么整体成功要么整体失败。如果其中一个属性设置失败,整个请求就会失败。对于在失败之前已成功设置的那些属性,使用 424 Failed Dependency 状态。
SEO 影响
像 Google 这样的搜索引擎不会索引返回 424 状态的 URL。过去已被索引但返回此状态码的 URL 会从搜索结果中移除。
示例
客户端提交请求,要更新某条会议注册记录的座位号和姓名。初次注册后,座位可以被添加、移除或更改。但不允许对姓名进行任何修改。由于姓名修改被 403 Forbidden 拒绝,整个请求被拒绝,这意味着对座位安排的更新也未能完成。
请求
PROPPATCH /update.html HTTP/1.1
Host: example.com
Content-Type: application/xml; charset="utf-8"
Content-Length: 305
<?xml version="1.0" encoding="utf-8" ?>
<d:propertyupdate xmlns:d="DAV:"
xmlns:z="urn:example">
<d:set>
<d:prop>
<z:seats>
<z:seatnumber>100</z:seatnumber>
<z:seatnumber>101</z:seatnumber>
</z:seats>
</d:prop>
<d:prop>
<d:name>Smith</d:name>
</d:prop>
</d:set>
</d:propertyupdate>
响应
HTTP/1.1 207 Multi-Status
Content-Type: application/xml; charset="utf-8"
Content-Length: 528
<?xml version="1.0" encoding="utf-8" ?>
<d:multistatus xmlns:d="DAV:"
xmlns:z="urn:example">
<d:response>
<d:href>
http://example.com/registrants/update.html
</d:href>
<d:propstat>
<d:prop><z:seats/></d:prop>
<d:status>
HTTP/1.1 424 Failed Dependency
</d:status>
</d:propstat>
<d:propstat>
<d:prop><z:name/></d:prop>
<d:status>HTTP/1.1 403 Forbidden</d:status>
</d:propstat>
<d:responsedescription>
The name of the registrant is not modifiable.
</d:responsedescription>
</d:response>
</d:multistatus>
如何修复
解析 207 Multi-Status 响应体,找到带有非 424 失败码的子请求。424 条目属于级联失败。根本原因是那个带有不同错误(如 403、409 或 423)的操作。
首先修复根本原因操作。在 PROPPATCH 请求中,单个属性更新以 403 Forbidden 失败会导致同一请求中的所有其他属性更新以 424 失败。解决被禁止的属性(移除有问题的字段或修正权限),然后重试整个 PROPPATCH。
检查是否存在资源锁。某个子请求上的 423 Locked 状态会以 424 级联到批次中的每一个其他操作。在重试前解锁资源,或在 If 头中包含正确的锁令牌。
在一些 WebDAV 实现中,顺序很重要。将相互独立的操作放在前面、有依赖关系的操作放在后面,这样部分失败影响的项就更少。
调试时将大批量请求拆分成较小的组。隔离各个操作能在无需解析复杂多状态响应的情况下暴露出真正失败的依赖项。
在服务器端,在每个 <d:responsedescription> 元素中返回描述性的错误消息,让客户端无需猜测即可识别出失败的属性或资源。
代码参考
.NET
HttpStatusCode.FailedDependency
Rust
http::StatusCode::FAILED_DEPENDENCY
Rails
:failed_dependency
Go
http.StatusFailedDependency
Symfony
Response::HTTP_FAILED_DEPENDENCY
Python3.5+
http.HTTPStatus.FAILED_DEPENDENCY
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_FAILED_DEPENDENCY
Angular
@angular/common/http/HttpStatusCode.FailedDependency