Qual è la differenza tra una POST e una PUT HTTP REQUEST?
Domanda
Entrambi sembrano inviare dati al server all'interno del corpo, quindi cosa li rende diversi?
Soluzione
HTTP PUT:
PUT inserisce un file o una risorsa in un URI specifico e esattamente in tale URI. Se esiste già un file o una risorsa in quell'URI, PUT sostituisce quel file o risorsa. Se non ci sono file o risorse lì, PUT ne crea uno. PUT è idempotent , ma paradossalmente le risposte PUT non sono memorizzabili nella cache .
Posizione RFC HTTP 1.1 per PUT
POST HTTP:
POST invia i dati a un URI specifico e si aspetta che la risorsa in tale URI gestisca la richiesta. Il server Web a questo punto può determinare cosa fare con i dati nel contesto della risorsa specificata. Il metodo POST non è idempotent , tuttavia le risposte POST < em> sono memorizzabili nella cache fintanto che il server imposta le intestazioni Cache-Control appropriate e scade.
La RFC HTTP ufficiale specifica che POST è:
- Annotazione di risorse esistenti;
- Invio di un messaggio a una bacheca, a un newsgroup, a una mailing list, o un gruppo simile di articoli;
- Fornire un blocco di dati, ad esempio il risultato dell'invio di a modulo, a un processo di gestione dei dati;
- Estensione di un database tramite un'operazione di accodamento.
Posizione RFC HTTP 1.1 per POST
Differenza tra POST e PUT:
Lo stesso RFC spiega la differenza fondamentale:
La differenza fondamentale tra il Le richieste POST e PUT si riflettono in il diverso significato di Richiesta-URI. L'URI in una richiesta POST identifica la risorsa che lo farà gestire l'entità chiusa. Quello la risorsa potrebbe essere un'accettazione di dati processo, un gateway per qualcun altro protocollo o un'entità separata che accetta annotazioni. Al contrario, il L'URI in una richiesta PUT identifica il file entità allegata alla richiesta - l'agente utente sa cos'è l'URI previsto e il server NON DEVE tenta di applicare la richiesta ad alcuni altra risorsa. Se il server lo desidera che la richiesta sia applicata a URI diverso, DEVE inviare una risposta 301 (spostata in modo permanente); l'agente utente PUO 'quindi effettuare la propria decisione relativa al reindirizzamento della richiesta o meno.
Utilizzando il metodo giusto, non correlato a parte:
Un vantaggio di REST ROA rispetto a SOAP è che quando si utilizza HTTP REST ROA, incoraggia il corretto utilizzo dei verbi / metodi HTTP. Quindi, per esempio, useresti PUT solo quando desideri creare una risorsa in quella posizione esatta. E non useresti mai GET per creare o modificare una risorsa.
Altri suggerimenti
Solo semantica.
Un PUT
HTTP dovrebbe accettare il corpo della richiesta e quindi memorizzarlo nella risorsa identificata dall'URI.
Un POST
HTTP è più generale. Dovrebbe avviare un'azione sul server. Tale azione potrebbe essere quella di archiviare il corpo della richiesta nella risorsa identificata dall'URI o potrebbe essere un URI diverso o potrebbe essere un'azione diversa.
PUT è come un caricamento di file. Un put a un URI influenza esattamente quell'URI. Un POST a un URI potrebbe avere alcun effetto.
Per fornire esempi di risorse in stile REST:
" POST / libri " con un mucchio di informazioni sul libro potrebbe creare un nuovo libro e rispondere con il nuovo URL che identifica quel libro: " / books / 5 " ;.
" PUT / books / 5 " dovrebbe creare un nuovo libro con ID 5 o sostituire il libro esistente con ID 5.
In stile senza risorse, il POST può essere utilizzato per qualsiasi cosa abbia un effetto collaterale. Un'altra differenza è che il PUT dovrebbe essere idempotente: più PUT degli stessi dati nello stesso URL dovrebbero andare bene, laddove più POST potrebbero creare più oggetti o qualunque cosa sia la tua azione POST.
PUT è inteso come metodo per "caricare" " roba in un URI particolare o sovrascrivere ciò che è già in quell'URI.
Il POST, d'altra parte, è un modo per inviare dati CORRELATI a un determinato URI.
Fare riferimento a la RFC HTTP
Per quanto ne so, PUT viene utilizzato principalmente per aggiornare i record.
-
POST - Per creare un documento o qualsiasi altra risorsa
-
PUT - Per aggiornare il documento creato o qualsiasi altra risorsa.
Ma per essere chiari sul fatto che PUT di solito 'Sostituisce' il record esistente se è presente e crea se non è presente ..
Altri hanno già pubblicato risposte eccellenti, volevo solo aggiungerlo con la maggior parte delle lingue, dei framework e dei casi d'uso di cui avrai a che fare con POST, molto più spesso di PUT. Al punto in cui PUT, DELETE, ecc. Sono fondamentalmente domande trivia.
- OTTIENI : recupera i dati dal server. Non dovrebbe avere altri effetti.
- POST : invia i dati al server per la creazione di una nuova entità. Spesso utilizzato quando si carica un file o si invia un modulo Web.
- PUT : simile a POST, ma utilizzato per sostituire un'entità esistente.
- PATCH : simile a PUT, ma utilizzato per aggiornare solo determinati campi all'interno di un'entità esistente.
- ELIMINA : rimuove i dati dal server.
- TRACCIA : fornisce un modo per testare quale server riceve. Restituisce semplicemente ciò che è stato inviato.
- OPZIONI : consente a un client di ottenere informazioni sui metodi di richiesta supportati da un servizio. L'intestazione di risposta pertinente è Consenti con metodi supportati. Utilizzato anche in CORS come richiesta di verifica preliminare per informare il server sul metodo di richiesta effettivo e chiedere informazioni sulle intestazioni personalizzate.
- HEAD : restituisce solo le intestazioni di risposta.
- CONNECT : utilizzato dal browser quando sa che parla a un proxy e l'URI finale inizia con https: //. Lo scopo di CONNECT è consentire la sessione TLS crittografata end-to-end, quindi i dati sono illeggibili per un proxy.
Un POST è considerato un metodo di tipo factory. Includete i dati con esso per creare ciò che volete e qualunque cosa si trovi dall'altra parte sa cosa farne. Un PUT viene utilizzato per aggiornare i dati esistenti in un determinato URL o per creare qualcosa di nuovo quando si sa quale sarà l'URI e non esiste già (al contrario di un POST che creerà qualcosa e restituirà un URL a se necessario).
Vedi: http://zacharyvoase.com/2009/07/03/http -post-mettere-diff /
Ultimamente sono stato abbastanza infastidito da un malinteso popolare da parte degli sviluppatori web che un POST viene utilizzato per creare una risorsa e un PUT per aggiornarne / cambiarne uno
Se dai un'occhiata a pagina 55 di RFC 2616 (& # 8220; Hypertext Transfer Protocol & # 8211; HTTP / 1.1 & # 8221;), Sezione 9.6 (& # 8220; PUT & # 8221;), & # 8217; vedrai a cosa serve PUT:
Il metodo PUT richiede che l'entità inclusa sia archiviata nell'URI di richiesta fornito.
C'è anche un utile paragrafo per spiegare la differenza tra POST e PUT:
La differenza fondamentale tra le richieste POST e PUT si riflette nel diverso significato di Request-URI. L'URI in una richiesta POST identifica la risorsa che gestirà l'entità chiusa. Tale risorsa potrebbe essere un processo di accettazione dei dati, un gateway verso qualche altro protocollo o un'entità separata che accetta le annotazioni. Al contrario, l'URI in una richiesta PUT identifica l'entità inclusa nella richiesta & # 8211; l'agente utente sa a cosa serve l'URI e il server NON DEVE tentare di applicare la richiesta ad altre risorse.
Non menziona nulla sulla differenza tra aggiornamento / creazione, perché non è ciò di cui si tratta. È circa la differenza tra questo:
obj.set_attribute(value) # A POST request.
E questo:
obj.attribute = value # A PUT request.
Quindi, per favore, ferma la diffusione di questo malinteso popolare. Leggi i tuoi RFC.
REST chiede agli sviluppatori di usare i metodi HTTP esplicitamente e in modo coerente con definizione del protocollo. Questo principio di progettazione REST di base stabilisce un mapping uno a uno tra creare, leggere, aggiornare ed eliminare (CRUD) operazioni e metodi HTTP. Secondo questo mappatura:
• Per creare una risorsa sul server, utilizzare POST.
• Per recuperare una risorsa, utilizzare GET.
• Per modificare lo stato di una risorsa o per aggiornarla, utilizzare PUT.
• Per rimuovere o eliminare una risorsa, utilizzare CANC.
Ulteriori informazioni: Servizi Web RESTful: le basi di IBM
La differenza tra POST e PUT è che PUT è idempotente, ciò significa che chiamare la stessa richiesta PUT più volte produrrà sempre lo stesso risultato (che non è un effetto collaterale), mentre d'altra parte, chiamare ripetutamente una richiesta POST può avere effetti (aggiuntivi) collaterali sulla creazione della stessa risorsa più volte.
GET
: le richieste che utilizzano GET recuperano solo dati, ovvero richiedono una rappresentazione della risorsa specificata
POST
: invia i dati al server per creare una risorsa. Il tipo di corpo della richiesta è indicato dall'intestazione Content-Type. Spesso provoca un cambiamento di stato o effetti collaterali sul server
PUT
: crea una nuova risorsa o sostituisce una rappresentazione della risorsa di destinazione con il payload della richiesta
PATCH
: viene utilizzato per applicare modifiche parziali a una risorsa
DELETE
: elimina la risorsa specificata
TRACE
: esegue un test di loopback del messaggio lungo il percorso della risorsa di destinazione, fornendo un utile meccanismo di debug
OPTIONS
: viene utilizzato per descrivere le opzioni di comunicazione per la risorsa di destinazione, il client può specificare un URL per il metodo OPTIONS o un asterisco (*) per fare riferimento all'intero server.
HEAD
: richiede una risposta identica a quella di una richiesta GET, ma senza il corpo della risposta
CONNECT
: stabilisce un tunnel per il server identificato dalla risorsa di destinazione, può essere utilizzato per accedere a siti Web che utilizzano SSL (HTTPS)
Vale la pena ricordare che POST
è soggetto ad alcuni attacchi CSRF comuni mentre PUT
non lo è.
Il CSRF di seguito non è impossibile con PUT
quando la vittima visita attackersite.com:
Richiesta normale (i cookie vengono inviati): ( PUT
non è un valore di attributo supportato)
<form id="myform" method="post" action="http://target.site.com/deleteUser" >
<input type="hidden" name="userId" value="5">
</form>
<script>document.createElement('form').submit.call(document.getElementById('myform'));</script>
Richiesta XHR (i cookie vengono inviati): ( PUT
attiverà una richiesta di verifica preliminare)
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://target.site.com/deleteUser");
xhr.withCredentials=true;
xhr.send(["userId=5"]);
Semplicemente
POST
viene utilizzato per creare una risorsa e restituisce la risorsa URI
EX
REQUEST : POST ..../books
{
"book":"booName",
"author":"authorName"
}
Questa chiamata dovrebbe creare un nuovo libro e restituire quel libro URI
Response ..../books/5
PUT
viene utilizzato per sostituire una risorsa, se tale risorsa esiste, è sufficiente aggiornarla, ma se tale risorsa non esiste quindi crearla,
REQUEST : PUT ..../books/5
{
"book":"booName",
"author":"authorName"
}
utilizzando PUT
forniremo l'identificatore di risorsa, ma POST
restituirà il nuovo identificatore di risorsa