PUT vs. POST in REST
Secondo la specifica HTTP/1.1:
Il metodo POST
è usato per richiedere che il server di origine accetti l'entità inclusa nella richiesta come un nuovo subordinato della risorsa identificata dal Request-URI
nella Request-Line
.
In altre parole, POST
è usato per creare.
Il metodo PUT
richiede che l'entità allegata sia memorizzata sotto il Request-URI
fornito. Se il Request-URI
si riferisce a una risorsa già esistente, l'entità allegata DEVE essere considerata come una versione modificata di quella che risiede sul server di origine. Se il Request-URI
non punta a una risorsa esistente, e quell'URI può essere definito come una nuova risorsa dall'interprete richiedente, il server d'origine può creare la risorsa con quell'URI;
Cioè, PUT
è usato per creare o aggiornare.
Quindi, quale dovrebbe essere usato per creare una risorsa? O bisogna supportarli entrambi?
Totale:
Sia PUT che POST possono essere usati per creare.
Dovete chiedere "a cosa state eseguendo l'azione? " per distinguere cosa dovreste usare. Supponiamo che tu stia progettando un'API per fare domande. Se volete usare POST allora lo farete su una lista di domande. Se volete usare PUT allora lo farete per una particolare domanda.
Entrambi possono essere usati, quindi quale dovrei usare nel mio design RESTful:
Non è necessario supportare sia PUT che POST.
Quello che viene usato è lasciato a voi. Ma ricordatevi di usare quello giusto a seconda dell'oggetto a cui fate riferimento nella richiesta.
Alcune considerazioni:
Un esempio:
Ho scritto quanto segue come parte di un'altra risposta su SO riguardo a questo:
POST:
Usate POST per creare e PUT per aggiornare. Questo è il modo in cui Ruby on Rails lo fa, comunque.
REST è un concetto molto di alto livello. In effetti, non menziona nemmeno HTTP!
Se avete dubbi su come implementare REST in HTTP, potete sempre dare un'occhiata alla specifica Atom Publication Protocol (AtomPub). AtomPub è uno standard per scrivere webservices RESTful con HTTP che è stato sviluppato da molti luminari di HTTP e REST, con alcuni input di Roy Fielding, l'inventore di REST e (co-)inventore di HTTP stesso.
In effetti, potresti anche essere in grado di usare AtomPub direttamente. Sebbene sia venuto fuori dalla comunità dei blog, non è in alcun modo limitato ai blog: è un protocollo generico per interagire in modo REST con collezioni arbitrarie (annidate) di risorse arbitrarie via HTTP. Se potete rappresentare la vostra applicazione come una collezione annidata di risorse, allora potete semplicemente usare AtomPub e non preoccuparvi se usare PUT o POST, quali codici di stato HTTP restituire e tutti questi dettagli.
Questo è ciò che AtomPub ha da dire sulla creazione delle risorse (sezione 9.2):
Per aggiungere membri ad una Collection, i client inviano richieste POST all'URI della Collection.