I metodi POST HTTP inviano dati come QueryString?

Mi piacerebbe sapere se il metodo POST su HTTP invia dati come QueryString o se utilizza una struttura speciale per passare i dati al server.

Infatti, quando analizzo la comunicazione con il metodo POST da client a server (con Fiddler ad esempio), non vedo alcuna QueryString, ma un contesto del corpo della forma con le coppie nome / valore.

Il modo migliore per visualizzarlo è utilizzare un analizzatore di pacchetti come Wireshark e seguire lo stream TCP . HTTP usa semplicemente TCP per inviare un stream di dati che inizia con poche righe di intestazioni HTTP. Spesso questi dati sono facili da leggere perché sono costituiti da HTML, CSS o XML, ma possono essere qualsiasi tipo di dati trasferiti su Internet (eseguibili, immagini, video, ecc.).

Per una richiesta GET, il computer richiede un URL specifico e il server Web di solito risponde con un codice di stato 200 e il contenuto della pagina Web viene inviato direttamente dopo le intestazioni delle risposte HTTP. Questo contenuto è lo stesso contenuto che vedresti se hai visto l’origine della pagina web nel tuo browser. La stringa di query che hai citato è solo una parte dell’URL e viene inclusa nell’intestazione di richiesta HTTP GET che il tuo computer invia al server web. Di seguito è riportato un esempio di una richiesta HTTP GET a http://accel91.citrix.com:8000/OA_HTML/OALogout.jsp?menu=Y , seguita da una risposta di reindirizzamento 302 dal server. Alcune intestazioni HTTP sono avvolte a causa delle dimensioni della finestra di visualizzazione (in realtà ne prendono solo una riga) e il reindirizzamento 302 include una semplice pagina Web HTML con un collegamento alla pagina Web reindirizzata (la maggior parte dei browser reindirizzerà automaticamente qualsiasi risposta 302 all’URL elencato nell’intestazione Location invece di visualizzare la risposta HTML):

HTTP GET con reindirizzamento 302

Per una richiesta POST, è ancora ansible avere una stringa di query, ma non è comune e non ha nulla a che fare con i dati che si sta postando. Invece, i dati vengono inclusi direttamente dopo le intestazioni HTTP che il browser invia al server, analogamente alla risposta di 200 che il server Web utilizza per rispondere a una richiesta GET. Nel caso di POST di un semplice modulo Web, questi dati vengono codificati utilizzando la stessa codifica URL utilizzata da una stringa di query, ma se si utilizza un servizio Web SOAP potrebbe anche essere codificato utilizzando un formato MIME e dati XML multiparte .

Ad esempio, ecco cosa rappresenta un POST HTTP per un servizio Web SOAP basato su XML situato all’indirizzo http://192.168.24.23:8090/msh in Wireshark Segui il stream TCP :

HTTP POST TCP Stream

Post utilizza il corpo del messaggio per inviare le informazioni al server, al contrario di Get, che utilizza la stringa di query (tutto dopo il punto interrogativo). È ansible inviare sia una stringa di query Get sia un corpo di messaggio Post nella stessa richiesta, ma ciò può risultare un po ‘confuso, quindi è meglio evitarlo.

In genere, le best practice impongono di utilizzare Get quando si desidera recuperare i dati e di pubblicare quando si desidera modificarlo. (Queste regole non sono scolpite nella pietra, le specifiche non vietano di alterare i dati con Get, ma sono generalmente evitate perché non si desidera che le persone apporteranno modifiche semplicemente facendo clic su un collegamento o digitando un URL)

Al contrario, puoi utilizzare Post per recuperare i dati senza cambiarli, ma utilizzando Ottieni significa che puoi aggiungere ai segnalibri la pagina, o condividere l’URL con altre persone, cose che non potevi fare se avessi usato Post.

Per quanto riguarda il formato effettivo dei dati inviati nel corpo del messaggio, è interamente a carico del mittente e viene specificato con l’intestazione Content-Type . Se non specificato, il tipo di contenuto predefinito per i moduli HTML è application/x-www-form-urlencoded , il che significa che il server si aspetta che il corpo del post sia una stringa codificata in modo simile a una stringa di query GET. Tuttavia questo non può dipendere da tutti i casi. RFC2616 dice quanto segue nell’intestazione Content-Type:

Qualsiasi messaggio HTTP / 1.1 contenente un ente-entity framework DOVREBBE includere a
Campo intestazione Content-Type che definisce il tipo di supporto di quel corpo. Se
e solo se il tipo di media non è dato da un campo Content-Type, il
destinatario PU MAY tentare di indovinare il tipo di supporto tramite ispezione del suo
contenuto e / o l’estensione del nome dell’URI utilizzato per identificare il
risorsa. Se il tipo di supporto rimane sconosciuto, il destinatario DOVREBBE
trattalo come tipo “application / octet-stream”.

Una richiesta POST può includere una stringa di query, ma normalmente non lo fa – un modulo HTML standard con un’azione POST di solito non include una stringa di query, ad esempio.

GET invierà i dati come una querystring, ma il POST no. Piuttosto lo invierà nel corpo della richiesta.

Se il tuo post tenta di raggiungere il seguente URL

mypage.php? id = 1

avrai i dati POST ma anche i dati GET.