2015-02-20 15 views
10

Ho un REST URI per un elenco di risorse, qualcosa come:Come aggiornare una collezione REST risorsa

http://foo.com/group/users 

Ognuno di questi utenti ha un numero di sequenza e voglio esporre un modo per rinumerare quei valori per tutti gli utenti della raccolta e rendere questa modifica disponibile per tutti coloro che accedono alla lista. Poiché si tratta di un'azione sulla raccolta nel suo insieme, non sono sicuro di come farlo.

posso immaginare un URL del tipo http://foo.com/group/users?sequence=normalize ma né un PUT né una POST rende davvero senso per l'intera lista, a meno che sottopongo tutta la collezione con i nuovi numeri come i dati del messaggio.

Come posso eseguire un aggiornamento a un'intera raccolta come questa in modo RESTful senza dover inviare nuovamente tutte le risorse aggiornate nella raccolta?

risposta

11

Dopo il commento del raffian sulla mia risposta iniziale, ho rielaborato la mia risposta per essere più riposante ...

  • utilizzare il metodo PATCH

Questo metodo è in genere progettato per aggiornare parzialmente lo stato di una risorsa. Nel caso di una risorsa lista, potremmo inviare una lista con solo gli elementi da aggiornare e gli identificatori degli elementi nella lista. La seguente richiesta sarebbe:

PATCH /group/users 
[ 
    { "id": "userId1", "sequence": "newSequenceNumber1" }, 
    { "id": "userId2", "sequence": "newSequenceNumber2" }, 
    (...) 
] 
  • Utilizzare il metodo POST sulla risorsa lista

Questo metodo è usato comunemente per aggiungere un elemento nella lista gestita dalla risorsa. Quindi, se vuoi sfruttarlo per questa azione, dobbiamo passare all'interno della richiesta un suggerimento riguardante l'azione da eseguire. Abbiamo la possibilità di aggiungere questo in un'intestazione dedicata o all'interno del payload.

Con l'approccio intestazione, si avrà qualcosa di simile:

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

Con l'approccio payload, si avrà qualcosa di simile:

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

Spero che ti aiuta , Thierry

+0

Questa sembra la giusta direzione, ma come gestisco se la richiesta non include tutti gli utenti correnti nell'elenco? Ad esempio: l'utente A ottiene l'elenco che contiene 50 utenti, l'utente B aggiunge un nuovo utente all'elenco, quindi A invia il 50 rinumerato in un PATCH ma non tiene conto di quel nuovo utente (o viceversa se un utente è stato cancellato). Sono preoccupato che in questo caso finiremmo con due numeri duplicati; c'è un modo per impedirlo? –

+3

Penso che dovresti considerare di sfruttare le intestazioni HTTP 'ETag' e' If-Match' per implementare il blocco ottimitico con REST. Questo link potrebbe interessarti: https://looselyconnected.wordpress.com/2010/03/25/the-http-etag-header-and-optimistic-locking-in-rest/. Spero che ti aiuti. –

2

È possibile utilizzare sia PATCH che POST sugli URI. Userei PATCH se fossi in te. È la soluzione migliore per gli aggiornamenti di massa.

1

Semanticamente, il HTTP PATCH method è il modo giusto per andare. Questo è anche descritto nel currently chosen answer.

PATCH /group/users 

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

Tuttavia, il secondo metodo descritto nella risposta scelta non è ristoratore, perché avete inventato nuovi verbi all'interno di una richiesta POST. Questo è SOAP, non REST.

Problemi correlati