424 Failed Dependency
Применение
Ошибка 424 Failed Dependency является частью Webdav, который используется как файловая система поверх HTTP. Когда приходит эта ошибка, код располагается внутри тела сообщения как часть ответа 207 Multi-Status. Это пример того, как успешный ответ содержит указание на сбой.
Клиент обязан разобрать ответ multi-status и, обнаружив ошибки 424 Failed Dependency, определить проблему и устранить её соответствующим образом.
Этот статус встречается при выполнении действия PROPPATCH, когда несколько свойств изменяются одновременно в одном HTTP-запросе. Как правило, HTTP-запрос либо полностью выполняется, либо полностью завершается неудачей. Если одно из свойств не удаётся установить, весь запрос считается неуспешным. Для свойств, успешно установленных до сбоя, используется статус 424 Failed Dependency.
Влияние на SEO
Поисковые системы вроде Google не будут индексировать URL с кодом ответа 424. Ранее проиндексированные 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 важен порядок. Размещайте независимые операции первыми, а зависимые — последними, чтобы частичные сбои затрагивали меньше элементов.
При отладке разбивайте большие пакетные запросы на меньшие группы. Изоляция отдельных операций делает истинную неудавшуюся зависимость очевидной без разбора сложного ответа multi-status.
На стороне сервера возвращайте описательные сообщения об ошибках в каждом элементе <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