207 Multi-Status
Применение
Ответ 207 Multi-Status приходит, когда один HTTP-запрос затрагивает несколько ресурсов. Например, POST-запрос, обновляющий несколько баз данных, может для одних завершиться успешно, а для других — неудачей. Тело ответа перечисляет отдельные результаты по каждому ресурсу.
По умолчанию тело представляет собой XML-документ с корневым элементом multistatus. Клиент разбирает каждый узел, чтобы определить исход каждой подоперации.
Корневой элемент содержит ноль или более элементов response в произвольном порядке. Каждый response включает элемент href, идентифицирующий целевой ресурс. Существуют два формата: статус относится либо к ресурсу целиком, либо к конкретным свойствам ресурса.
WebDAV
Код состояния 207 Multi-Status используется в основном протоколом WebDAV. Обычные HTTP-клиенты редко сталкиваются с этим ответом за пределами сценариев WebDAV.
Статус ресурса целиком
Дочерний элемент status содержит итоговый HTTP-код состояния для идентифицированного ресурса. Предполагается, что клиенты умеют обрабатывать стандартные HTTP-коды состояния, которые здесь встречаются.
<d:response>
<d:href>http://example.re/tasks</d:href>
<d:status>HTTP/1.1 200 OK</d:status>
</d:response>
Статус отдельных свойств
Методы PROPFIND и PROPPATCH используют propstat вместо status, чтобы сообщать о состоянии отдельных свойств ресурса.
<d:response>
<d:href>http://example.re/tasks</d:href>
<d:propstat>
<d:prop>
<d:getcontentlanguage>
"en-CA"
</d:getcontentlanguage>
</d:prop>
<d:status>HTTP/1.1 200 OK</d:status>
</d:propstat>
</d:response>
Признак успеха или неудачи
Ответ 207 Multi-Status сигнализирует об общем успехе, общей неудаче или о сочетании того и другого. Клиент изучает каждый элемент response, чтобы оценить полноту выполнения операции.
Пример
Клиент отправляет на сервер XML-данные. Затронуты три независимых ресурса, и сервер возвращает отдельный результат по каждому из них.
Первые два ресурса обработаны успешно: первый не возвращает тела (204), а второй подтверждает создание нового ресурса (201). Третий ресурс сообщает об ошибке 423, поскольку удерживается блокировка. По этим отдельным кодам клиент определяет, завершилась ли операция в целом успехом или неудачей.
Запрос
POST /signup HTTP/1.1
Host: example.com
Content-Type: application/xml
Content-Length: 93
<?xml version="1.0"?>
<person>
<name>David Smith</name>
<country>USA</country>
</person>
Ответ
HTTP/1.1 207 Multi-Status
Content-Type: application/xml; charset="utf-8"
Content-Length: 568
<?xml version="1.0" encoding="utf-8" ?>
<d:multistatus xmlns:d="DAV:">
<d:response>
<d:href>http://example.re/signup/r1</d:href>
<d:status>HTTP/1.1 204 No Content</d:status>
</d:response>
<d:response>
<d:href>http://example.re/signup/r2</d:href>
<d:status>HTTP/1.1 201 Created</d:status>
</d:response>
<d:response>
<d:href>http://example.re/signup/r3</d:href>
<d:status>HTTP/1.1 423 Locked</d:status>
<d:error><d:lock-token-submitted/></d:error>
</d:response>
</d:multistatus>
Примеры кода
.NET
HttpStatusCode.MultiStatus
Rust
http::StatusCode::MULTI_STATUS
Rails
:multi_status
Go
http.StatusMultiStatus
Symfony
Response::HTTP_MULTI_STATUS
Python3.5+
http.HTTPStatus.MULTI_STATUS
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_MULTI_STATUS
Angular
@angular/common/http/HttpStatusCode.MultiStatus