Mi chiedevo quali fossero le opinioni delle persone su un'operazione RESTful PUT
che non restituisce nulla (nullo) nel corpo della risposta.
Mi chiedevo quali fossero le opinioni delle persone su un'operazione RESTful PUT
che non restituisce nulla (nullo) nel corpo della risposta.
Risposte:
La specifica HTTP ( RFC 2616 ) contiene una serie di raccomandazioni applicabili. Ecco la mia interpretazione:
200 OK
per un PUT riuscito di un aggiornamento a una risorsa esistente. Nessun corpo di risposta necessario. (Secondo la Sezione 9.6 , 204 No Content
è ancora più appropriato.)201 Created
per un PUT riuscito di una nuova risorsa, con l'URI più specifico per la nuova risorsa restituito nel campo dell'intestazione Ubicazione e qualsiasi altro URI e metadata della risorsa echeggiato nel corpo della risposta. ( RFC 2616 Sezione 10.2.2 )409 Conflict
per un PUT che non riesce a causa di un 3 ° modifica -party, con un elenco di differenze tra il tentativo di aggiornamento e la risorsa corrente nel corpo della risposta. ( RFC 2616 Sezione 10.4.10 )400 Bad Request
per un PUT non riuscito, con testo in lingua naturale (come l'inglese) nel corpo della risposta che spiega perché il PUT non è riuscito. ( RFC 2616 Sezione 10.4 )No response body needed
in relazione a un 200. In realtà l'organismo di risposta non è affatto menzionato in relazione a un PUT. Afferma soloIf an existing resource is modified, either the 200 (OK) or 204 (No Content) response codes SHOULD be sent to indicate successful completion of the request.
A differenza della maggior parte delle risposte qui, in realtà penso che PUT dovrebbe restituire la risorsa aggiornata (oltre al codice HTTP ovviamente).
Il motivo per cui si desidera restituire la risorsa come risposta per l'operazione PUT è perché quando si invia una rappresentazione della risorsa al server, il server può anche applicare un po 'di elaborazione a questa risorsa, quindi il client vorrebbe sapere come funziona questa risorsa sembra dopo che la richiesta è stata completata correttamente. (altrimenti dovrà emettere un'altra richiesta GET).
Penso che sia possibile per il server restituire contenuti in risposta a un PUT. Se si utilizza un formato di inviluppo della risposta che consente i dati trasferiti lateralmente (come il formato utilizzato dai dati di brace), è possibile includere anche altri oggetti che possono essere stati modificati tramite trigger del database, ecc. N. di richieste, e questo sembra un ottimo posto per ottimizzare.)
Se accetto il PUT e non ho nulla da riferire, utilizzo il codice di stato 204 senza body. Se ho qualcosa da segnalare, utilizzo il codice di stato 200 e includo un corpo.
Le specifiche HTTP / 1.1 (sezione 9.6) discute i codici di risposta / errore appropriati. Tuttavia, non tratta il contenuto della risposta.
Cosa ti aspetteresti? Un semplice codice di risposta HTTP (200 ecc.) Mi sembra semplice e chiaro.
Se il back-end dell'API REST è un database relazionale SQL, quindi
Se non ti interessano gli aggiornamenti persi o se vuoi forzare i tuoi clienti a fare un GET immediatamente dopo un PUT, non restituire nulla da PUT.
Codice di risposta HTTP di 201 per "Creato" insieme a un'intestazione "Posizione" per indicare dove il client può trovare la risorsa appena creata.
Ho usato l'API RESTful nei miei servizi, ed ecco la mia opinione: per prima cosa dobbiamo arrivare a una visione comune : PUT
viene utilizzato per aggiornare una risorsa non creata o ottenuta.
Ho definito le risorse con: Stateless resource
e Stateful resource
:
Risorse stateless Per queste risorse, è sufficiente restituire HttpCode con il corpo vuoto, è sufficiente.
Risorse con stato Ad esempio: la versione della risorsa. Per questo tipo di risorse, è necessario fornire la versione quando si desidera modificarla, quindi restituire la risorsa completa o restituire la versione al client, quindi il client non deve inviare una richiesta get dopo l'azione di aggiornamento.
Ma , per un servizio o un sistema, conservalosimple
, clearly
, easy to use and maintain
è la cosa più importante.
Proprio come un corpo di richiesta vuoto è in linea con lo scopo originale di una richiesta GET e un corpo di risposta vuoto è in linea con lo scopo originale di una richiesta PUT.
sembra ok ... anche se penso che un'indicazione rudimentale di successo / fallimento / tempo pubblicato / # byte ricevuti / ecc. sarebbe preferibile.
modifica: stavo pensando in base all'integrità e / o alla conservazione dei dati; metadati come un hash MD5 o un timestamp per il tempo ricevuto possono essere utili per file di dati di grandi dimensioni.
Idealmente, restituirebbe una risposta di successo / fallimento.
C'è una differenza tra l'intestazione e il corpo di una risposta HTTP. PUT non dovrebbe mai restituire un corpo, ma deve restituire un codice di risposta nell'intestazione. Basta scegliere 200 se ha avuto successo e 4xx in caso contrario. Non esiste un codice di ritorno null. Perchè vuoi fare questo?
200
PUT, DELETE o di qualsiasi altro metodo. Ho dimenticato qualcosa? Come Mozilla che diventa il capo di W3 e IETF? ;) O forse non hanno mai sentito parlare del principio di robustezza di Postel.