2015-04-10 9 views
17

Kennen Sie eine "Best Practice", um eine REST-Methode zum Ändern der Reihenfolge einer kleinen Sammlung zu entwerfen?Ändern Sie die Array-/Sammlungsreihenfolge mithilfe einer REST-API

Ich habe eine Sammlung ausgestellt bei "GET/api/v1/items". Dieser Endpunkt gibt ein JSON-Array zurück und jedes Element hat eine eindeutige ID.

Ich dachte über create "PATCH/api/v1/items" und senden Sie ein Array von IDs mit der neuen Reihenfolge. Aber ich frage mich, ob es alternative oder Entwurfsmuster gibt, um diese Aufgabe richtig zu erfüllen.

+1

meinst du die Bestellung von einem Kunden zu ändern? eine Art Update-Vorgang? – dit

+0

@dit, das ist. Ich baue eine REST-API. Ich brauche einen Endpunkt, um einem Client zu ermöglichen, die Reihenfolge einer kleinen Sammlung zu ändern, ohne die gesamte Sammlung erneut zu "setzen". –

Antwort

13

der REST einheitlichen Schnittstelle Zwang folgend, die HTTP PUT und PATCH Methoden, um die Standard-Semantik zu halten, so dass Sie tun können, dass entweder mit einem in der folgenden Art und Weise:

Mit PUT, Kunden ein ganze hochladen neue Darstellung in der gewünschten Reihenfolge. Sie werden GET /api/v1/items anfordern, ändern Sie die Reihenfolge, wie sie benötigen, und senden Sie sie zurück mit PUT /api/v1/items.

Mit PATCH können Clients ein Diff-Dokument senden, das die Auftragsänderung nach Bedarf ausführt. Sie können ein Format wie json-patch verwenden, und Clients führen die Änderung mit den move Operation- und Arraypfaden durch.

Beachten Sie, dass es sich bei beiden nicht um Entwurfsmuster oder Best Practices handelt. Sie sind einfach wie die Methoden PUT und PATCH funktionieren sollen. Idealerweise sollte dies bei jeder RESTful-Anwendung funktionieren, die die Methoden GET, PUT und PATCH korrekt für die Ressource an diesem URI implementiert, und das ist das Schöne an REST. Wenn Sie es richtig machen, müssen Sie es nur einmal tun und Kunden können für alle verallgemeinern. Zum Beispiel kann ein Kunde wählen, es mit kleinen Sammlungen PUT Weg zu tun, und die PATCH Weg für größere.

Sowohl Ihre Idee PATCH mit einer id-Array zu verwenden, und die answerfrom @dit was darauf hindeutet, es zu tun mit PUT ist nicht wirklich RESTful, weil sie mit der Standard-Semantik brechen auf: Ihre für kein Delta-Format, seine um Teilupdates mit PUT durchzuführen. Beide Optionen können jedoch RESTful sein, wenn sie mit POST ausgeführt werden. POST ist die Methode für jede Aktion, die nicht durch das HTTP-Protokoll standardisiert ist, so dass Sie alles tun können, was Sie wollen, aber Sie müssen dokumentieren, wie genau es geht.

Also, es liegt an Ihnen. Wenn Sie sich Sorgen um RESTful machen und Ihre Anwendung langfristige Ziele verfolgt - ich spreche von Jahren oder sogar Jahrzehnten - würde ich sagen, dass Sie für eine einheitliche Implementierung der Methoden PUT und PATCH wie vorgeschlagen zuerst gehen. Wenn Sie einen einfachen Ansatz bevorzugen, verwenden Sie Ihre Idee oder dit mit POST.

+0

Schöne Erklärung, danke. –

+0

Ich denke auch ein Prioritätsattribut hinzufügen und lassen Sie den Client die Sortierung und ändern Sie die Reihenfolge "PATCH/items /: id" mit Prioritätswert. –

+0

Wenn die Array-Reihenfolge stabil ist, denke ich nicht, dass das erforderlich ist, aber wenn es für Sie klarer macht, gehen Sie dafür. –

1

ok, ich hatte ein ähnliches Problem und werde versuchen zu erklären, wie ich es gelöst habe.

meine Radtour hat ungefähr 5 Stationen. Jede Station hat eine eindeutige ID und Bestellnummer:

stations": [ 

    { 
     "uid": 1, 
     "order": 1 
    }, 
    { 
     "uid": 2, 
     "order": 2 
    }, 
    { 
     "uid": 3, 
     "order": 3 
    }, 
    { 
     "uid": 4, 
     "order": 4 
    }, 
    { 
     "uid": 5, 
     "order": 5 
    } 

] 

Jedes Mal wenn die Reihenfolge der einzelnen Artikel geändert wurde (drag and drop) i senden REST Anfrage an meine Webservice.

Angenommen, wir möchten die Station uid = 3 eine Position nach unten verschieben. Station mit uid = 3 geht nach unten und Station mit uid = 4 geht nach oben. So sieht mein PUT Anfrage wie folgt aus:

...myapplication.com/api/changeorder?station=3&direction=down 

nun auf der Server-Seite muss ich nur Titel dieses nach unten zu verschieben Aktion betroffen finden und ihre Reihenfolge in der Datenbank aktualisieren. Mein REST-Webservice sendet OK, wenn das Update erfolgreich war.

In meinem Fall war es nicht notwendig, die neue sortierte Liste zu senden, weil meine Benutzeroberfläche immer durch Ziehen und Ablegen geändert wurde.

Verwandte Themen