API RESTful, qual è il modo migliore per implementare cambiamenti di stato ed eventi?

4

Ad esempio, devo aggiornare lo stato di un "Ordine d'acquisto" da "Bozza" a "Inviato". Qual è il modo migliore per farlo?

Semplicemente aggiorno il campo di stato sul lato client e poi POST l'intera entità su / purchase_order / 1

E che dire degli eventi? Ad esempio, desidero far sì che tutti gli ordini di acquisto siano impostati su "Inviati", qual è la migliore pratica per questo, in termini di endpoint e responsabilità del cliente?

    
posta wnoveno 26.02.2016 - 10:01
fonte

2 risposte

5

Se esegui google "aggiornamento parziale REST" riceverai molte opinioni.

Detto questo ti darò i miei pensieri.

Un PUT dovrebbe essere usato per un aggiornamento completo di una risorsa, quindi cambiando solo un parametro con il POSTing su / purchase_order / 1 un risultato recente di GET to / purchase_order / 1 con il campo dello stato cambiato da bozza a inviato .

Un'altra opzione sarebbe quella di inviare un PUT a / purchase_order / 1 / status con un valore di inviato, che potrebbe quindi essere interpretato sul lato server come aggiornamento allo stato di sub-risorsa della risorsa purchase_order. Potresti anche restituire 303 indicando la risorsa / purchase_order / 1 per far sapere al client che una risorsa diversa da quella con cui hanno interagito è cambiata e dove trovare quella risorsa.

Potresti considerare il verbo PATCH, ma se segui correttamente la semantica, non dovresti semplicemente inviare lo stato richiesto, ma piuttosto un tipo di contenuto che specifichi che elenca un insieme di operazioni che desideri applicare.

Se un'azione ha effetti collaterali, è necessario chiarirla nella propria API. Quindi fai attenzione quando usi PUT, che è progettato per essere idempotente.

    
risposta data 26.02.2016 - 11:00
fonte
1

Controlla questa Stackoverflow domanda.

Fondamentalmente hai due possibilità:

  • Utilizza una richiesta di PATCH
  • Utilizzare una richiesta di POST con i dati parziali che si desidera aggiornare e restituire un codice di stato HTTP 303. Questo è usato per indicare che la richiesta POST è stata eseguita e una risorsa è stata cambiata. Ciò restituisce anche la posizione della risorsa modificata.

Uso il secondo approccio nelle mie applicazioni. Per esempio. per un ordine modificato:

{
  "id": 1,
  "status": 2
}

Quindi modificare l'ordine sul server e restituire un codice di stato 303 con la posizione dell'ordine modificato.

Per gli eventi: in teoria, seguire esattamente la metodologia REST che dovresti creare per ogni ordine una richiesta POST con lo stato modificato e ricevere la posizione della risorsa. Tuttavia nella pratica è possibile inviare una matrice degli ordini modificati al server e ricevere un elenco delle posizioni delle risorse.

    
risposta data 26.02.2016 - 10:56
fonte

Leggi altre domande sui tag