Risposta breve: nelle richieste POST, i valori vengono inviati nel "corpo" della richiesta. Con i moduli Web sono molto probabilmente inviati con un tipo di supporto application/x-www-form-urlencoded
o multipart/form-data
. I linguaggi di programmazione o i framework che sono stati progettati per gestire le richieste Web di solito fanno "The Right Thing ™" con tali richieste e offrono un facile accesso ai valori prontamente decodificati (come $_REQUEST
o $_POST
in PHP, o cgi.FieldStorage()
, flask.request.form
in Python).
Ora divagiamo un po ', il che può aiutare a capire la differenza;)
La differenza tra GET
e le POST
richieste sono in gran parte semantiche. Sono anche "usati" in modo diverso, il che spiega la differenza nel modo in cui i valori vengono passati.
Quando si esegue una GET
richiesta, si richiede al server una o una serie di entità. Per consentire al client di filtrare il risultato, può utilizzare la cosiddetta "stringa di query" dell'URL. La stringa di query è la parte dopo il ?
. Questo fa parte della sintassi dell'URI .
Pertanto, dal punto di vista del codice dell'applicazione (la parte che riceve la richiesta), sarà necessario ispezionare la parte della query URI per accedere a questi valori.
Si noti che le chiavi e i valori fanno parte dell'URI. I browser possono imporre un limite alla lunghezza dell'URI. Lo standard HTTP afferma che non esiste alcun limite. Ma al momento in cui scriviamo, la maggior parte dei browser non limitano gli URI (non ho valori specifici). GET
le richieste non devono mai essere utilizzate per inviare nuove informazioni al server. Soprattutto documenti non più grandi. Ecco dove dovresti usare POST
o PUT
.
Quando esegue una POST
richiesta, il client sta effettivamente inviando un nuovo documento all'host remoto. Pertanto, una stringa di query non ha senso (semanticamente). Ecco perché non puoi accedervi nel codice dell'applicazione.
POST
è un po 'più complesso (e molto più flessibile):
Quando ricevi una richiesta POST, dovresti sempre aspettarti un "payload" o, in termini HTTP: un corpo di messaggio . Il corpo del messaggio in sé è piuttosto inutile, in quanto non esiste un formato standard (per quanto ne so. Forse application / octet-stream?). Il formato del corpo è definito dall'intestazione Content-Type
. Quando si utilizza un FORM
elemento HTML con method="POST"
, questo è di solito application/x-www-form-urlencoded
. Un altro tipo molto comune è multipart / form-data se si utilizzano i caricamenti di file. Ma potrebbe essere qualsiasi cosa , che va da text/plain
, sopra application/json
o addirittura un'usanza application/octet-stream
.
In ogni caso, se POST
viene fatta una richiesta con una Content-Type
che non può essere gestita dall'applicazione, dovrebbe restituire un 415
codice di stato .
La maggior parte dei linguaggi di programmazione (e / o web framework) offre un modo per de / codificare il corpo del messaggio da / verso i tipi più comuni (come application/x-www-form-urlencoded
, multipart/form-data
o application/json
). Quindi è facile. I tipi personalizzati richiedono potenzialmente un po 'più di lavoro.
Utilizzando come esempio un documento codificato in un modulo HTML standard, l'applicazione dovrebbe eseguire i seguenti passaggi:
- Leggi il
Content-Type
campo
- Se il valore non è uno dei tipi di supporto supportati, restituire una risposta con un
415
codice di stato
- in caso contrario, decodificare i valori dal corpo del messaggio.
Ancora una volta, lingue come PHP o web framework per altre lingue popolari probabilmente gestiranno questo per te. L'eccezione a questo è l' 415
errore. Nessun framework può prevedere quali tipi di contenuto la tua applicazione sceglie di supportare e / o non supportare. Questo lo devi decidere tu.
Una PUT
richiesta viene gestita praticamente nello stesso modo di una POST
richiesta. La grande differenza è che una POST
richiesta dovrebbe consentire al server di decidere come (e se non del tutto) creare una nuova risorsa. Storicamente (dall'ormai obsoleto RFC2616 era creare una nuova risorsa come "subordinata" (figlio) dell'URI a cui era stata inviata la richiesta).
Una PUT
richiesta al contrario dovrebbe "depositare" una risorsa esattamente in quell'URI e con esattamente quel contenuto. Ne più ne meno. L'idea è che il cliente abbia la responsabilità di creare la risorsa completa prima di "inserirla". Il server dovrebbe accettarlo così com'è nell'URL indicato.
Di conseguenza, una POST
richiesta non viene in genere utilizzata per sostituire una risorsa esistente. Una PUT
richiesta può sia creare che sostituire.
Nota a margine
Esistono anche " parametri di percorso " che possono essere utilizzati per inviare dati aggiuntivi al telecomando, ma sono così insoliti che non entrerò in troppi dettagli qui. Ma, per riferimento, ecco un estratto dall'RFC:
A parte i segmenti di punti nei percorsi gerarchici, un segmento di percorso è considerato opaco dalla sintassi generica. Le applicazioni che producono URI utilizzano spesso i caratteri riservati consentiti in un segmento per delimitare i sottocomponenti specifici dello schema o del gestore della dereference. Ad esempio, i punti riservati punto e virgola (";") e uguale ("=") vengono spesso utilizzati per delimitare i parametri e i valori dei parametri applicabili a quel segmento. Il carattere riservato virgola (",") viene spesso utilizzato per scopi simili. Ad esempio, un produttore di URI potrebbe utilizzare un segmento come "nome; v = 1.1" per indicare un riferimento alla versione 1.1 di "nome", mentre un altro potrebbe utilizzare un segmento come "nome, 1.1" per indicare lo stesso. I tipi di parametro possono essere definiti dalla semantica specifica dello schema,
multipart/form-data
. Per coloro che sono interessati, ecco una domanda al riguardo .