HTTPQUERY
Русский

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