207 Multi-Status
Verwendung
Eine 207-Multi-Status-Antwort trifft ein, wenn eine einzelne HTTP-Anfrage mehrere Ressourcen betrifft. Beispielsweise kann eine POST-Anfrage, die mehrere Datenbanken aktualisiert, bei einigen erfolgreich sein und bei anderen fehlschlagen. Der Antwortrumpf listet die einzelnen Ergebnisse für jede Ressource auf.
Standardmäßig ist der Rumpf ein XML-Dokument mit dem Wurzelelement multistatus. Der Client parst jeden Knoten, um das Ergebnis jeder Teiloperation zu bestimmen.
Das Wurzelelement enthält null oder mehr response-Elemente in beliebiger Reihenfolge. Jedes response enthält ein href-Element, das die Zielressource identifiziert. Es existieren zwei Formate: Der Status bezieht sich entweder auf die Ressource als Ganzes oder auf bestimmte Eigenschaften der Ressource.
WebDAV
Der Statuscode 207 Multi-Status wird vorwiegend von WebDAV verwendet. Standard-HTTP-Clients begegnen dieser Antwort außerhalb von WebDAV-Abläufen nur selten.
Status der Ressource als Ganzes
Ein untergeordnetes status-Element enthält den resultierenden HTTP-Statuscode für die bezeichnete Ressource. Von Clients wird erwartet, dass sie die hier auftretenden Standard-HTTP-Statuscodes verarbeiten.
<d:response>
<d:href>http://example.re/tasks</d:href>
<d:status>HTTP/1.1 200 OK</d:status>
</d:response>
Status einzelner Eigenschaften
Die Methoden PROPFIND und PROPPATCH verwenden propstat anstelle von status, um über einzelne Eigenschaften einer Ressource zu berichten.
<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>
Erfolgs- oder Fehlerkennzeichnung
Eine 207-Multi-Status-Antwort signalisiert vollständigen Erfolg, vollständiges Scheitern oder eine Mischung aus beidem. Der Client prüft jedes response-Element, um die Vollständigkeit der Operation zu beurteilen.
Beispiel
Der Client sendet XML-Daten per POST an den Server. Drei voneinander unabhängige Ressourcen sind beteiligt, und der Server gibt für jede einzelne ein eigenes Ergebnis zurück.
Die ersten beiden Ressourcen sind erfolgreich: Die erste gibt keinen Rumpf zurück (204), die zweite bestätigt, dass eine neue Ressource erstellt wurde (201). Die dritte Ressource meldet einen 423-Fehler, weil eine Sperre gehalten wird. Anhand dieser einzelnen Codes entscheidet der Client, ob die Gesamtoperation erfolgreich war oder fehlgeschlagen ist.
Anfrage
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>
Antwort
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>
Code-Referenzen
.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