Ich denke, dass Sie eine POST- oder PATCH-Methode verwenden könnten, um dies zu handhaben, da sie normalerweise dafür ausgelegt sind.
Die Verwendung einer POSTMethode wird normalerweise verwendet, um ein Element hinzuzufügen, wenn es für Listenressourcen verwendet wird. Sie können jedoch auch mehrere Aktionen für diese Methode unterstützen. Siehe diese Antwort: So aktualisieren Sie eine REST-Ressourcensammlung . Sie können auch verschiedene Darstellungsformate für die Eingabe unterstützen (wenn sie einem Array oder einem einzelnen Element entsprechen).
In diesem Fall ist es nicht erforderlich, Ihr Format zu definieren, um das Update zu beschreiben.
Die Verwendung einer PATCHMethode ist ebenfalls geeignet, da entsprechende Anforderungen einer teilweisen Aktualisierung entsprechen. Laut RFC5789 ( http://tools.ietf.org/html/rfc5789 ):
Einige Anwendungen, die das Hypertext Transfer Protocol (HTTP) erweitern, erfordern eine Funktion, um teilweise Ressourcenänderungen vorzunehmen. Die vorhandene HTTP-PUT-Methode ermöglicht nur das vollständige Ersetzen eines Dokuments. Dieser Vorschlag fügt eine neue HTTP-Methode, PATCH, hinzu, um eine vorhandene HTTP-Ressource zu ändern.
In diesem Fall müssen Sie Ihr Format definieren, um die teilweise Aktualisierung zu beschreiben.
Ich denke, dass in diesem Fall POSTund PATCHsind ziemlich ähnlich, da Sie nicht wirklich die Operation beschreiben müssen, die für jedes Element zu tun ist. Ich würde sagen, dass es vom Format der zu sendenden Darstellung abhängt.
Der Fall von PUTist etwas weniger klar. Wenn Sie eine Methode verwenden PUT, sollten Sie die gesamte Liste bereitstellen. Tatsächlich ersetzt die in der Anforderung bereitgestellte Darstellung die Listenressource 1.
Sie können zwei Optionen bezüglich der Ressourcenpfade haben.
- Verwenden des Ressourcenpfads für die Dokumentliste
In diesem Fall müssen Sie den Link von Dokumenten mit einem Ordner in der Darstellung, die Sie in der Anforderung angeben, explizit angeben.
Hier ist eine Beispielroute dafür /docs.
Der Inhalt eines solchen Ansatzes könnte für die Methode sein POST:
[
{ "doc_number": 1, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 2, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 3, "binder": 5, (other fields in the case of creation) },
(...)
]
- Verwenden des Unterressourcenpfads des Binderelements
Darüber hinaus können Sie auch Unterrouten nutzen, um die Verbindung zwischen Dokumenten und Ordnern zu beschreiben. Die Hinweise zur Zuordnung zwischen einem Dokument und einem Ordner müssen jetzt nicht mehr im Anforderungsinhalt angegeben werden.
Hier ist eine Beispielroute dafür /binder/{binderId}/docs. In diesem Fall senden Sie eine Liste von Dokumenten mit einer Methode POSToder PATCHhängen Dokumente an den Ordner mit der Kennung binderIdan, nachdem Sie das Dokument erstellt haben, falls es nicht vorhanden ist.
Der Inhalt eines solchen Ansatzes könnte für die Methode sein POST:
[
{ "doc_number": 1, (other fields in the case of creation) },
{ "doc_number": 2, (other fields in the case of creation) },
{ "doc_number": 3, (other fields in the case of creation) },
(...)
]
In Bezug auf die Antwort liegt es an Ihnen, die Antwortstufe und die zurückzugebenden Fehler zu definieren. Ich sehe zwei Ebenen: die Statusebene (globale Ebene) und die Nutzlaststufe (dünnere Ebene). Sie müssen auch festlegen, ob alle Ihrer Anfrage entsprechenden Einfügungen / Aktualisierungen atomar sein müssen oder nicht.
In diesem Fall können Sie den HTTP-Status nutzen. Wenn alles gut geht, bekommen Sie einen Status 200. Wenn nicht, ein anderer Status, z. B. 400wenn die angegebenen Daten nicht korrekt sind (z. B. die Binder-ID ist nicht gültig) oder etwas anderes.
In diesem Fall wird ein Status 200zurückgegeben, und es liegt an der Antwortdarstellung, zu beschreiben, was getan wurde und wo letztendlich Fehler auftreten. ElasticSearch hat in seiner REST-API einen Endpunkt für die Massenaktualisierung. Dies könnte Ihnen einige Ideen auf dieser Ebene geben: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/bulk.html .
Sie können auch eine asynchrone Verarbeitung implementieren, um die bereitgestellten Daten zu verarbeiten. In diesem Fall wird der HTTP-Status zurückgegeben 202. Der Client muss eine zusätzliche Ressource abrufen, um zu sehen, was passiert.
Bevor ich fertig bin, möchte ich auch darauf hinweisen, dass die OData-Spezifikation das Problem in Bezug auf die Beziehungen zwischen Entitäten mit der Funktion " Navigationslinks" behebt . Vielleicht könntest du dir das mal ansehen ;-)
Der folgende Link kann Ihnen auch helfen: https://templth.wordpress.com/2014/12/15/designing-a-web-api/ .
Hoffe es hilft dir, Thierry
GET /docsabzurufen, rufe ich alle Dokumente in einem bestimmten Ordner auf und rufe sie abGET /docs?binder_id=x. Um eine Teilmenge der Ressourcen zu löschen, würde ich anrufenDELETE /docs?binder_id=xoder sollte ichDELETE /docsmit einem{"binder_id": x}im Anfragetext anrufen ? Würden Sie jemalsPATCH /docs?binder_id=xfür ein Batch-Update verwenden oder nurPATCH /docsPaare übergeben?