REST Lazy Reference Crea GET o POST?

0

Ho un'API REST dove:

GET or POST /foo/{foo_id}/bar?a=1,b=2,c=3

e

GET /bar/{bar_id}

entrambi producono

200 { bar_id: <GUID>, foo_id: <foo_id>, a: 1, b: 2, c:3 }

Se per la prima chiamata non viene trovato nessun% co_de corrispondente, verrà generato e persistuto bar . L'operazione è idempotente, ma potenzialmente non è di sola lettura. La prima chiamata dovrebbe essere bar o GET ? Sono propenso ad entrambi, perché non riesco a trovare un argomento convincente per l'uno sull'altro in tutto ciò che ho letto sull'argomento.

    
posta Blake Mitchell 30.07.2016 - 19:04
fonte

2 risposte

3

GET non dovrebbe mai creare una risorsa. Non uno che è visibile all'utente. È un'operazione di sola lettura.

Lo standard per POST e PUT è anche per restituire un 201 Created code, invece di 200 OK , quando una risorsa è stata mantenuta. Ciò significa distinguere completamente se una risorsa è stata salvata o semplicemente recuperata.

Dovresti abbandonare GET completamente. Se la prima operazione creerà sempre una risorsa bar e restituirà un 409 Conflict quando esiste già una risorsa con lo stesso identificativo, è ottimale se hai utilizzato POST .

Tuttavia, se si desidera creare una risorsa bar quando viene passata una nuova o semplicemente si utilizza una già esistente, è possibile utilizzare anche PUT anziché POST . PUT viene in genere utilizzato sia per la creazione e l'aggiornamento di una risorsa, vale a dire. lo crea quando non si trova nessuna corrispondenza o lo aggiorna. Ma ricorda, PUT dovrebbe essere usato solo quando puoi aggiornare un'intera risorsa durante una richiesta. Per gli aggiornamenti parziali il metodo PATCH è molto più adatto.

    
risposta data 30.07.2016 - 20:15
fonte
1

Should the first call be a GET or a POST?

Dovrebbe essere un GET .

Il motivo principale è che il client, se sto seguendo correttamente, non sa che sta creando una risorsa né si sta preparando per creare una risorsa.

Il client desidera lo stato corrente della risorsa dal server. Non si sa che questo potrebbe significare creare una risorsa e non gliene frega del fatto che questa è la prima volta che qualcuno ha tentato di ottenere questa risorsa, né che il server deve creare la risorsa alla sua fine (cosa mai significa il contesto del server).

Il client vuole solo lo stato corrente di quella risorsa.

REST non ha nulla a che fare con le operazioni CRUD sul lato server. In realtà il punto di REST è che quei dettagli dovrebbero essere nascosti dal client. Il cliente non si preoccupa affatto di ciò che il server deve fare per riuscire a fornire al cliente una rappresentazione della risorsa. Se il server deve eseguire una grande query SQL in una transazione per creare questa risorsa, al client non interessa.

La cosa da ricordare qui è la direzione del controllo. Il client sta dicendo al server dammi la tua rappresentazione della risorsa foobar . Questo è ciò che è GET. come fa il server dipende dal server.

Se hai utilizzato POST o PUT che è il client che dice "Ecco la mia rappresentazione di foobar , aggiorna te stesso"

Ma nel tuo scenario il cliente non è responsabile della creazione iniziale di foobar , il server lo è. Il client vuole solo la rappresentazione del server e non dovrebbe conoscere alcun effetto collaterale di tale operazione.

    
risposta data 03.08.2016 - 12:34
fonte

Leggi altre domande sui tag