2015-02-20 9 views
10

Ich habe ein REST-URI für eine Liste von Ressourcen, so etwas wie:Wie eine REST-Ressource-Sammlung aktualisieren

http://foo.com/group/users 

Jeder dieses Benutzers hat eine Sequenznummer und ich möchte eine Art und Weise entlarven diese Werte neu zu nummerieren für alle Benutzer in der Sammlung und diese Änderung für jeden verfügbar machen, der auf die Liste zugreift. Da dies eine Aktion auf die Sammlung als Ganzes ist, bin ich nicht sicher, wie dies zu erreichen ist.

kann ich eine URL wie http://foo.com/group/users?sequence=normalize vorstellen, aber weder ein PUT noch ein POST wirklich Sinn macht für die ganze Liste, es sei denn, ich die ganze Sammlung mit den neuen Zahlen, wie die Nachrichtendaten vor.

Wie kann ich eine gesamte Sammlung auf REST-basierende Weise aktualisieren, ohne alle aktualisierten Ressourcen in der Sammlung erneut senden zu müssen?

Antwort

11

Nach Kommentar des raffian auf meiner ersten Antwort, ich meine Antwort nachbearbeitet mehr RESTful zu sein ...

  • Verwenden Sie die Methode PATCH

Dieses Verfahren typischerweise teilweise zu aktualisieren ausgelegt ist der Zustand einer Ressource. Im Fall einer Listenressource könnten wir eine Liste mit nur den zu aktualisierenden Elementen und den Identifikatoren der Elemente in der Liste senden. Die folgende Anfrage wäre:

PATCH /group/users 
[ 
    { "id": "userId1", "sequence": "newSequenceNumber1" }, 
    { "id": "userId2", "sequence": "newSequenceNumber2" }, 
    (...) 
] 
  • Verwenden Sie die Methode POST auf der Liste Ressource

Dieses Verfahren, das üblicherweise ein Element in der Liste verwendet wird, von der Ressource verwaltet hinzuzufügen. Wenn Sie es für diese Aktion nutzen möchten, müssen Sie innerhalb der Anfrage einen Hinweis bezüglich der auszuführenden Aktion übergeben. Wir haben die Wahl, dies entweder in einem dedizierten Header oder in der Payload hinzuzufügen.

Mit dem Header Ansatz, werden Sie so etwas haben:

POST /group/users 
X-Action: renumbering 
[ 
    { "id": "userId1", "sequence": "newSequenceNumber1" }, 
    { "id": "userId2", "sequence": "newSequenceNumber2" }, 
    (...) 
] 

Mit dem Nutzlast Ansatz, werden Sie so etwas haben:

POST /group/users 
{ 
    "action": "renumbering", 
    "list": { 
     [ 
      { "id": "userId1", "sequence": "newSequenceNumber1" }, 
      { "id": "userId2", "sequence": "newSequenceNumber2" }, 
      (...) 
     ] 
    } 
} 

Hoffe, dass es hilft Ihnen, , Thierry

+0

Dies scheint die richtige Richtung, aber wie gehe ich vor, wenn die Anfrage nicht alle aktuellen Benutzer in der Liste enthält? Beispiel: Benutzer A ruft die Liste ab, in der sich 50 Benutzer befinden. Benutzer B fügt der Liste einen neuen Benutzer hinzu, dann sendet A die neu nummerierten 50 in einem PATCH, berücksichtigt diesen neuen Benutzer jedoch nicht (oder umgekehrt) ein Benutzer wurde gelöscht.) Ich bin besorgt in diesem Fall würden wir mit zwei doppelten Nummern enden; Gibt es einen Weg, das zu verhindern? –

+3

Ich denke, Sie sollten überlegen, die HTTP-Header ETag und If-Match zu nutzen, um optimistisches Sperren mit REST zu implementieren. Dieser Link könnte Sie interessieren: https://looselyconnected.wordpress.com/2010/03/25/the-http-etag-header-and-optimistic-locking-in-rest/. Hoffe es hilft dir. –

2

Sie können sowohl PATCH und verwenden POST auf den URIs. Ich würde PATCH verwenden, wenn ich du wäre. Es ist die beste Lösung für Massenupdates.

1

Semantisch gesprochen ist die HTTP PATCH method der richtige Weg zu gehen. Dies ist auch in der currently chosen answer beschrieben.

PATCH /group/users 

[ 
    { "id": "userId1", "sequence": "newSequenceNumber1" }, 
    { "id": "userId2", "sequence": "newSequenceNumber2" }, 
    ... 
] 

jedoch das zweite Verfahren in der gewählten Antwort beschrieben ist nicht ruhig, weil Sie neue Verben in einer POST-Anfrage erfunden. Dies ist SOAP, nicht REST.

Verwandte Themen