2015-04-10 4 views
17

Conosci una "migliore prassi" per progettare un metodo REST per modificare l'ordine di una piccola raccolta?Modificare l'ordine matrice/raccolta utilizzando un'API REST

Ho una collezione esposta in "GET/api/v1/items". Questo endpoint restituisce un array JSON e ogni elemento ha un ID univoco.

Stavo pensando di creare "PATCH/api/v1/items" e inviare una matrice di ID con il nuovo ordine. Ma mi chiedo se ci sia qualche alternativa o modello di progettazione per svolgere correttamente questa attività.

+1

intendi cambiare l'ordine da un cliente? qualche tipo di operazione di aggiornamento? – dit

+0

@dit, cioè. Sto costruendo un'API REST. Ho bisogno di un endpoint per consentire a un client di modificare l'ordine di una piccola raccolta senza "rimettere" di nuovo l'intera raccolta. –

risposta

13

A seguito del vincolo un'interfaccia uniforme REST, l'HTTP PUT e PATCH metodi devono attenersi alla semantica standard, in modo che si può fare con uno dei due nel seguente modo:

Con PUT, i clienti possono caricare un intero nuova rappresentazione con l'ordine che vogliono Richiederanno GET /api/v1/items, modificheranno l'ordine in base alle esigenze e lo invieranno di nuovo con PUT /api/v1/items.

Con PATCH, i clienti possono inviare un documento diff che esegue il cambio di ordine di cui hanno bisogno. È possibile utilizzare un formato come json-patch ei client eseguono la modifica con l'operazione move e i percorsi dell'array.

Essere consapevoli che nessuno di questi sono modelli di progettazione o migliori pratiche. Sono semplicemente come funzionano i metodi PUT e PATCH. Idealmente, questo dovrebbe funzionare su qualsiasi applicazione RESTful che implementa correttamente i metodi GET, PUT e PATCH per la risorsa a quell'URI, e questa è la bellezza di REST. Se lo fai nel modo giusto, devi farlo una volta sola e i clienti possono generalizzare per tutti. Ad esempio, un cliente può scegliere di farlo in modo PUT con piccole raccolte e il modo PATCH per quelli più grandi.

Sia la vostra idea di utilizzare PATCH con una serie id e la @dit answerfrom suggerendo di farlo con PUT non sono realmente RESTful, perché sono la rottura con la semantica standard: la vostra per non usare un formato di Delta, la sua per fare aggiornamenti parziali con PUT. Tuttavia, entrambe queste opzioni possono essere RESTful se eseguite con POST. POST è il metodo per eseguire qualsiasi azione non standardizzata dal protocollo HTTP, in modo che tu possa fare tutto ciò che vuoi con esso, ma devi documentare esattamente come farlo.

Quindi, tocca a voi. Se siete preoccupati di essere RESTful e la vostra applicazione ha obiettivi a lungo termine - sto parlando di anni o addirittura di decenni - direi di fare un'implementazione uniforme dei metodi PUT e PATCH come suggerito prima. Se preferisci un approccio semplice, usa la tua o l'idea di dit con POST.

+0

Bella spiegazione, grazie. –

+0

Sto pensando anche di aggiungere un attributo di priorità e lasciare che il client faccia l'ordinamento e di modificare l'ordine "PATCH/items /: id" con valore di priorità. –

+0

Se l'ordine dell'array è stabile, non penso che sia necessario, ma se lo rende più chiaro per te, fallo. –

1

ok, ho avuto un problema simile e proverò a spiegare come l'ho risolto.

il mio tour in bici ha circa 5 stazioni. Ogni stazione ha un ID e l'ordine numero univoco:

stations": [ 

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

] 

Ogni volta se l'ordine del singolo elemento è stato modificato (drag and drop) trasmetto richiesta REST al mio webservice.

Supponiamo di voler spostare la stazione uid = 3 una posizione in basso. La stazione con uid = 3 scende e si posiziona con uid = 4 aumenta. Quindi il mio PUT richiesta simile alla seguente:

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

Ora, sul lato server non mi resta che trovare gli oggetti interessati da questa azione spostare verso il basso e aggiornare il loro ordine nel mio database. Il mio servizio web REST invia OK se l'aggiornamento è andato a buon fine.

Nel mio caso non è stato necessario inviare la nuova lista ordinata, perché la mia UI è stata sempre modificata mediante il trascinamento della selezione.

Problemi correlati