424 Failed Dependency
使い方
424 Failed Dependency エラーは、HTTP 上のファイルシステムとして使われる WebDAV の一部です。このエラーを受け取ると、そのコードは 207 Multi-Status レスポンスの一部としてメッセージボディ内に現れます。これは、成功したレスポンスが失敗の表示を含む一例です。
クライアントはマルチステータスのレスポンスを解析し、424 Failed Dependency エラーを見つけた場合は問題を特定して適切に解決する責任を負います。
このステータスは、1回の HTTP リクエストで複数のプロパティを同時に変更する PROPPATCH の操作中に遭遇します。一般に、HTTP リクエストは成功するか失敗するかのいずれかです。プロパティのうち1つの設定が失敗すると、リクエスト全体が失敗します。失敗の前に正常に設定されたプロパティには、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 リクエストでは、1つのプロパティ更新が 403 Forbidden で失敗すると、同じリクエスト内の他のすべてのプロパティ更新が 424 で失敗します。禁止されているプロパティを解消し(問題のフィールドを削除するか権限を修正し)、その後 PROPPATCH 全体を再試行します。
リソースのロックを確認します。1つのサブリクエストにおける 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