2009-07-31 3 views
36

Sono appena arrivato alla programmazione Web e sono solo curioso di sapere come ottenere e inviare metodi di invio di dati da una pagina all'altra.Perché il metodo GET è più veloce del POST in HTTP?

Si dice che il metodo Get sia più veloce di Post ma non so perché è un motivo per cui posso trovare è che Get può prendere solo 255 caratteri con esso? C'è qualche altro motivo, per favore qualcuno mi spieghi?

+9

È necessario scegliere GET vs POST in base al fatto che l'azione abbia effetti collaterali, nessuna differenza di prestazioni percepita. – Draemon

risposta

38

Non si tratta di velocità. Ci sono molti casi in cui il POST è più applicabile. Ad esempio, i motori di ricerca indicizzeranno gli URL GET e i browser potranno aggiungerli ai segnalibri e farli comparire nella cronologia. Di conseguenza, se si intraprendono azioni come la modifica di un DB in base a una richiesta GET, potrebbe essere dannoso in quanto alcuni robot potrebbero anche attraversare l'URL.

L'altro caso può essere un problema di sicurezza. Se pubblichi le credenziali tramite GET, verrà elencato nella cronologia del browser e nei file di registro del server.

+0

come funzionano questi metodi c'è una sorta di serializzazione utilizzata per memorizzare i valori e quindi la deserializzazione per ottenere i dati memorizzati. –

+1

Per l'invio di moduli semplici, entrambi si basano su coppie di valori chiave. GET incorpora quelli nell'URL stesso (stringa di query) e POST lo invia nel corpo della richiesta. –

+0

Quindi ci sono problemi relativi alla lunghezza dell'URL. Anche se stai eseguendo un'azione che potrebbe essere altrimenti un GET (come una semplice ricerca), sei vincolato dalla lunghezza di ciò che è consentito da GET e potresti essere costretto a scegliere POST. – demongolem

9

Guardando il protocollo http, POST o GET dovrebbero essere ugualmente facili e veloci da analizzare. Direi che non c'è differenza di prestazioni.

Date un'occhiata alle intestazioni HTTP prime

http GET

GET /index.html?userid=joe&password=guessme HTTP/1.1 
Host: www.mysite.com 
User-Agent: Mozilla/4.0 

HTTP Post

POST /login.jsp HTTP/1.1 
Host: www.mysite.com 
User-Agent: Mozilla/4.0 
Content-Length: 27 
Content-Type: application/x-www-form-urlencoded 

userid=joe&password=guessme 

Dal mio punto di vista, le prestazioni non dovrebbe essere considerato quando confrontando GET e POST.

+7

GET è meno pacchetti quindi POST. Che mostra nel tuo esempio. Pacchetti sempre più piccoli e più veloci da elaborare. I pacchetti più grandi anche in un singolo byte sono almeno da qualche parte in memor/cpu la sua implementazione extra. Quindi confrontando GET o POST, direi in base alla dimensione del pacchetto GET sarà più veloce. – YumYumYum

+0

@YumYumYum +1. Nel mio GET applicato è 2x più veloce del POST! –

0

POST farà crescere di più le intestazioni, solo ingrandendole, ma la differenza dovrebbe essere trascurabile davvero, quindi non vedo perché questo dovrebbe essere un problema.

Basta ricordare che il modo corretto per parlare HTTP è utilizzare GET solo per azioni e POST per i dati. Non devi, ma non vuoi neanche avere un caso in cui i robot di Google possano, ad esempio, inserire, eliminare o manipolare dati che erano destinati a essere gestiti da un essere umano semplicemente perché sta seguendo i collegamenti che trova .

+0

Questo non è completamente vero. Per chiarire: GET è pensato per essere idempotente e generalmente non ha corpo. Il post non è necessariamente idempotente e generalmente ha un corpo. Nota, io dico che GET "generalmente" non ha corpo perché la specifica HTTP non lo disabilita (IIRC) ma la maggior parte dei server probabilmente lo ignorerà. – Tom

24

Ci sono diversi equivoci su GET e POST in HTTP. C'è una differenza primaria, GET deve essere idempotente mentre il POST non deve essere. Ciò significa che i GET non causano effetti collaterali, cioè posso inviare un GET a un'applicazione web tutte le volte che voglio (credo di premere Ctrl + R o F5 molte volte) e le richieste saranno 'sicure'

Non riesco a farlo con il POST, un POST può cambiare i dati sul server. Ad esempio, se ordino un articolo sul web l'articolo dovrebbe essere aggiunto con un POST perché lo stato è cambiato sul server, il numero di elementi che ho aggiunto è aumentato di 1. Se l'ho fatto con un POST e l'aggiornamento del colpo nel browser il browser mi avverte, se lo faccio con un GET il browser invierà semplicemente la richiesta.

Sul server GET vs POST è pura convenzione, cioè spetta a me come sviluppatore garantire che codice il POST sul server per non ripetere la chiamata. Ci sono vari modi per farlo, ma questa è un'altra domanda.

Per rispondere effettivamente alla domanda se utilizzo GET o POST per eseguire lo stesso compito non ci sono differenze di prestazioni.

È possibile leggere l'RFC (http://www.w3.org/Protocols/rfc2616/rfc2616.html) per ulteriori dettagli.

+0

Grazie per il suggerimento che il POST viene utilizzato in modo che la chiamata ripetuta non possa essere eseguita sul lato server. –

+0

Questo non è quello che ha detto frank, il messaggio potrebbe comportare dei cambiamenti, tuttavia non vi è alcuna garanzia per la postazione di modifiche, potrebbe essere solo perché la registrazione dei dati è più ottimale per l'use case rispetto all'URL, non esiste una regola mandataria che afferma post modifica qualcosa –

7

Si dovrebbe pensare a GET come "un posto dove andare" e POST come "fare qualcosa". Ad esempio, un modulo di ricerca deve essere inviato utilizzando GET perché la pagina dei risultati della ricerca è un "luogo" e l'utente vorrà segnalarlo o recuperarlo dalla cronologia in un secondo momento. Se si invia il modulo utilizzando POST, l'utente può solo ricreare la pagina inviando nuovamente il modulo. D'altra parte, se dovessi eseguire un'azione come fare clic su un pulsante di eliminazione, non vorrai inviarlo con GET, poiché l'azione verrebbe ripetuta ogni volta che l'utente tornasse all'URL.

39

Un'altra cosa su http post è che può essere 2 chiamate quando viene utilizzata l'intestazione http Expect: 100-Continue. Il primo browser invia le intestazioni dei post http e le risposte del server con "HTTP 100 Continua". Quando il browser riceve questo, invia il corpo reale.

http://omaralzabir.com/atlas_2__http_post_is_slower_and_it_s_default_in_atlas/

penso che questa è la risposta che l'autore stava cercando.

+1

Questa è sicuramente la risposta che stavo cercando. Grazie! – nrodic

+0

ragazzi, ** sei sicuro ** ??? Due richieste ?? È un'assurdità! https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods. Per il metodo GET i dati possono essere trasferiti solo nella parte 'query' dell'intestazione di una richiesta. Per le richieste POST - i dati vengono trasmessi nel corpo della richiesta e quando si inviano dati usando 'Content-Type = application/x-www-form-urlencoded', le richieste avranno quasi la stessa dimensione (nella maggior parte dei casi - POST è più grande). Ma la differenza è ** insignificante **, meno di millisecondi per 10.000 richieste ... – maxkoryukov

1

GET è leggermente più veloce poiché i valori vengono inviati in intestazione differenza del POST i valori vengono inviati nella richiesta corpo, nel formato che il tipo di contenuto specifica.

Di solito il tipo di contenuto è application/x-www-form-urlencoded, in modo che il corpo della richiesta utilizza lo stesso formato come la stringa di query:

parametro = valore & = anche un altro Quando si utilizza un upload di file nel modulo, invece, si utilizza la codifica multipart/form-data, che ha un formato diverso. È più complicato

1

Sono d'accordo con altre risposte, ma non è stato detto che le richieste GET possono essere memorizzate nella cache mentre le richieste POST non vengono mai memorizzate nella cache. Penso che questo sia il motivo principale per cui alcune richieste GET vengono eseguite più velocemente. (Di-grossolana questo significa che a volte nessuna richiesta viene effettivamente inviata Quindi in realtà non è la richiesta GET che è più veloce, ma la cache del browser..)

metodi HTTP: GET vs POST: http://www.w3schools.com/tags/ref_httpmethods.asp

5

Proprio I miei pochi centesimi dal 2016.

Sto creando un semplice sistema di messaggi. All'inizio ho usato il POST per ricevere nuovi avvisi. In jQuery ho avuto:

$.post('/a/alerts', 'stamp=' + STAMP, function(result) 
{ 
}); 

E in PHP ho usato $ _POST [ 'timbro']. Anche da localhost ho ottenuto 90-100 ms per ogni richiesta come questa. Ho semplicemente cambiato:

$.get('/a/alerts?stamp=' + STAMP, function(result) 
{ 
}); 

e in PHP passato a $ _GET [ 'timbro']. Quindi un po 'meno di 1 minuto di modifiche. Ora ogni richiesta richiede 30-40 ms.

Così GET può essere due volte più veloce POST. Certo che non sempre, ma per piccole quantità di dati ottengo sempre gli stessi risultati.