207 Multi-Status
Uso
Una respuesta 207 Multi-Status llega cuando una sola solicitud HTTP afecta a varios recursos. Por ejemplo, una solicitud POST que actualiza varias bases de datos puede tener éxito en unas y fallar en otras. El cuerpo de la respuesta enumera los resultados individuales de cada recurso.
De forma predeterminada, el cuerpo es un documento XML con un elemento raíz multistatus. El cliente analiza cada nodo para determinar el resultado de cada suboperación.
El elemento raíz contiene cero o más elementos response en cualquier orden. Cada response incluye un elemento href que identifica el recurso de destino. Existen dos formatos: el estado se refiere al recurso en su conjunto o a propiedades concretas del recurso.
WebDAV
El código de estado 207 Multi-Status lo utiliza principalmente WebDAV. Los clientes HTTP estándar rara vez encuentran esta respuesta fuera de los flujos de trabajo de WebDAV.
Estado del recurso en su conjunto
Un elemento hijo status contiene el código de estado HTTP resultante para el recurso identificado. Se espera que los clientes gestionen los códigos de estado HTTP estándar que aparezcan ahí.
<d:response>
<d:href>http://example.re/tasks</d:href>
<d:status>HTTP/1.1 200 OK</d:status>
</d:response>
Estado de propiedades individuales
Los métodos PROPFIND y PROPPATCH usan propstat en lugar de status para informar sobre propiedades individuales de un recurso.
<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>
Indicación de éxito o fallo
Una respuesta 207 Multi-Status señala un éxito global, un fallo global o una mezcla de ambos. El cliente examina cada elemento response para evaluar hasta qué punto se completó la operación.
Ejemplo
El cliente envía datos XML al servidor. Intervienen tres recursos independientes y el servidor devuelve resultados individuales para cada uno.
Los dos primeros recursos tienen éxito: el primero no devuelve cuerpo (204) y el segundo confirma que se creó un recurso nuevo (201). El tercer recurso informa de un error 423 porque hay un bloqueo activo. El cliente determina si la operación global tuvo éxito o falló a partir de estos códigos individuales.
Solicitud
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>
Respuesta
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>
Referencias de código
.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