Domanda

Qual è la regola empirica per il passaggio di dati in un URL REST nella stringa di query rispetto al corpo di una richiesta?

Vale a dire: stai creando un servizio per aggiungere giocatori di hockey. Puoi andare con:

PUT /players 
{ "name": Gretzky }

o

PUT /players?name=Gretzky

Se stai trasmettendo molti dati, dovresti scegliere l'opzione n. 1 in quanto esiste un limite alla lunghezza dell'URL. Ma a parte questo, perché non usare semplicemente la stringa di query per passare i dati?


Aggiorna : rimosso il commento che potresti testare l'opzione n. 2 in un browser. Hai realizzato (duh) che puoi fare GET-s solo nel tuo browser.

È stato utile?

Soluzione

In base alla definizione HTTP di PUT, la tua prima richiesta è di sovrascrivere l'elenco dei giocatori con un nuovo elenco che contiene solo un nome di giocatore. Non si sta aggiungendo all'elenco dei giocatori.

La seconda opzione non ha molto senso per me. Fare PUT senza un corpo non è realmente coerente con il significato di PUT.

Considerando che una delle definizioni standard di POST è aggiungere a una risorsa esistente, non sono sicuro del perché non lo faresti

POST /players 
{ "name": Gretzky }

Se sei sicuro che tutti i nomi dei tuoi giocatori saranno univoci, puoi usare PUT in questo modo:

PUT /player/Gretzky
{ "name": Gretzky }

Quando si decide di eseguire REST su HTTP, si accetta di utilizzare HTTP nel modo definito in RFC2616. Questo è ciò che significa il vincolo di interfaccia uniforme. E solo per essere pedanti, non esiste un URL REST e non puoi testare nessuna delle opzioni in un browser perché senza javascript, non puoi eseguire un PUT in un browser.

Altri suggerimenti

L'opzione n. 1 va bene, anche se probabilmente è eccessiva. L'opzione n. 1 va non bene perché non è idempotente.

L'opzione n. 2 è un'idea CATTIVA . Sarebbe un uso improprio di PUT. Il PUT dovrebbe essere utilizzato principalmente quando il payload dei dati della richiesta è un blocco opaco di dati, di solito di grandi dimensioni o gerarchico. Payload più piccoli e non gerarchici hanno più senso come POST.

Inoltre, cerca di evitare di cambiare stato tramite i parametri della query. Non c'è nulla di tecnicamente pericoloso a riguardo se non si tratta di una richiesta GET, ma non è realmente RESTful.

In questo caso, ciò che dovresti fare è:

POST /players HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 12

name=Gretsky

Questo dovrebbe restituire una risposta 201 Created . (C'è un'eccezione a ciò: se non si crea immediatamente la risorsa e potrebbe essere rifiutata in un secondo momento, utilizzare invece 202 Accepted .)

La scrittura di un servizio Web REST che utilizza più HTTP di POST e GET deve essere eseguita dopo dopo aver letto specifica HTTP . (È una lettura molto utile.) Questa regola è un po 'più flessibile se stai usando un framework che prende tutte le decisioni per te.

La mia comprensione delle operazioni REST è che l'URL identifica in modo univoco la risorsa, mentre il corpo della richiesta contiene la rappresentazione della risorsa. Detto questo, è discutibile se una delle tue opzioni sia davvero RESTful.

Il primo sarebbe, supponendo che la risorsa sia denominata " Players " e un GET su quella risorsa restituisce un elenco di giocatori (non entrerò nella domanda se quel GET restituisca o meno altri URL di risorse ... Fielding direbbe che dovrebbe, con richieste individuali per ottenere i dati delle risorse).

Il secondo sarebbe, supponendo che il corpo della richiesta contenesse informazioni codificate per nome "Gretsky". Tuttavia, ciò richiede di generare le chiavi esternamente.

L'URL utilizzato dovrebbe identificare la risorsa nel corpo, in base ai componenti del percorso o ai parametri della query, anche se preferirei i componenti del percorso per qualcosa come un nome o un ID. Il corpo dovrebbe essere una rappresentazione; quello che PUTTI dovrebbe essere uguale o simile a quello che OTTIENI dallo stesso URL (o puoi ottenere, nel caso di più formati)

L'esempio n. 1 non è appropriato perché stai inviando una rappresentazione per un singolo giocatore a un URL per tutti i giocatori. Il POST sarebbe più appropriato in questo caso.

L'esempio n. 2 sarebbe leggermente inappropriato se esteso a tutti i campi perché invieresti i dati di rappresentazione nell'URL.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top