HTTP POST permintaan membekalkan data tambahan dari klien (penyemak imbas) ke pelayan dalam badan mesej. Berbeza, GET permintaan termasuk semua data yang diperlukan dalam URL. Bentuk dalam HTML boleh menggunakan salah satu kaedah dengan menentukan kaedah = "POST" atau kaedah = "GET" (lalai) dalam elemen. Kaedah yang ditentukan menentukan bagaimana data borang dihantar ke pelayan. Apabila kaedah GET, semua data borang dikodkan ke URL, ditambahkan kepada tindakan URL sebagai parameter rentetan pertanyaan. Dengan POST, data bentuk muncul dalam badan mesej permintaan HTTP.
GET | POST | |
---|---|---|
Sejarah | Parameter kekal dalam sejarah pelayar kerana ia adalah sebahagian daripada URL | Parameter tidak disimpan dalam sejarah penyemak imbas. |
Telah ditandakan | Boleh dijadikan bookmark. | Tidak boleh ditandakan. |
Butang BACK / tunduk semula tingkah laku | Permintaan GET dilaksanakan semula tetapi mungkin tidak diserahkan semula ke pelayan jika HTML disimpan dalam cache penyemak imbas. | Pelayar biasanya memberi amaran kepada pengguna bahawa data perlu dihantar semula. |
Jenis pengekodan (atribut enctype) | permohonan / x-www-form-urlencoded | data multipart / borang atau aplikasi / x-www-form-urlencoded Gunakan pengekodan berbilang untuk data binari. |
Parameter | boleh menghantar tetapi data parameter adalah terhad kepada apa yang boleh kita masukkan ke dalam baris permintaan (URL). Terus menggunakan kurang daripada 2K parameter, sesetengah pelayan mengendalikan sehingga 64K | Boleh menghantar parameter, termasuk memuat naik fail, ke pelayan. |
Digodam | Lebih mudah untuk menggodam skrip kiddies | Lebih sukar untuk hack |
Sekatan ke atas jenis data borang | Ya, hanya aksara ASCII yang dibenarkan. | Tiada sekatan. Data perduaan juga dibenarkan. |
Keselamatan | GET kurang selamat berbanding POST kerana data yang dihantar adalah sebahagian daripada URL. Jadi ia disimpan dalam sejarah penyemak imbas dan log pelayan dalam plaintext. | POST sedikit lebih selamat daripada GET kerana parameter tidak disimpan dalam sejarah penyemak imbas atau dalam log pelayan web. |
Sekatan ke atas panjang data borang | Ya, kerana data bentuk dalam URL dan panjang URL adalah terhad. Had panjang URL yang selamat seringkali mengandungi 2048 aksara tetapi berbeza dengan penyemak imbas dan pelayan web. | Tiada sekatan |
Kebolehgunaan | Kaedah GET tidak boleh digunakan apabila menghantar kata laluan atau maklumat sensitif yang lain. | Kaedah POST yang digunakan semasa menghantar kata laluan atau maklumat sensitif yang lain. |
Keterlihatan | Kaedah GET boleh dilihat oleh semua orang (ia akan dipaparkan dalam bar alamat penyemak imbas) dan mempunyai had jumlah maklumat untuk dihantar. | Pembolehubah kaedah POST tidak dipaparkan dalam URL. |
Cached | Boleh cache | Tidak cache |
Perbezaan asas antara METODE = "GET" dan KAEDAH = "POST" adalah bahawa mereka sesuai dengan permintaan HTTP yang berlainan, seperti yang ditakrifkan dalam spesifikasi HTTP. Proses penyerahan untuk kedua-dua kaedah bermula dengan cara yang sama - set data bentuk dibina oleh penyemak imbas dan kemudian dikodkan dengan cara yang ditentukan oleh enctype atribut. Untuk KAEDAH = "POST yang enctype atribut boleh berbilang / data bentuk atau permohonan / x-www-form-urlencoded, sedangkan untuk METODE = "GET", sahaja permohonan / x-www-form-urlencoded dibenarkan. Set data borang ini kemudiannya dihantar ke pelayan.
Untuk penyerahan borang dengan METODE = "GET", pelayar membina URL dengan mengambil nilai dari tindakan atribut, tambah a ? untuk itu, kemudian menambah set data borang (dikodkan menggunakan jenis aplikasi / x-www-bentuk-url dikodkan semula). Penyemak imbas kemudian memproses URL ini seolah-olah mengikuti pautan (atau seolah-olah pengguna telah menaip URL secara langsung). Pelayar membahagikan URL ke bahagian dan mengiktiraf tuan rumah, kemudian menghantar kepada tuan rumah permintaan GET dengan seluruh URL sebagai hujah. Pelayan mengambilnya dari sana. Ambil perhatian bahawa proses ini bermaksud bahawa data bentuk adalah terhad kepada kod ASCII. Penjagaan khas harus diambil untuk mengekod dan menyusun semula jenis watak lain apabila menyampaikannya melalui URL dalam format ASCII.
Penyerahan borang dengan METODE = "POST" menyebabkan permintaan POST dihantar, menggunakan nilai tindakan atribut dan mesej yang dibuat mengikut jenis kandungan yang ditentukan oleh enctype atribut.
Oleh kerana data borang dihantar sebagai sebahagian daripada URL apabila GET digunakan --
Pada dasarnya, pemprosesan data borang yang dihantar bergantung kepada sama ada ia dihantar dengan METODE = "GET" atau KAEDAH = "POST". Oleh kerana data dikodkan dalam pelbagai cara, mekanisme penyahkodan yang berbeza diperlukan. Oleh itu, secara amnya, mengubah KAEDAH mungkin memerlukan perubahan skrip yang memproses penyerahan. Sebagai contoh, apabila menggunakan antara muka CGI, skrip menerima data dalam pembolehubah persekitaran (QUERYSTRING) apabila GET digunakan. Tetapi apabila POST digunakan, data bentuk diluluskan dalam strim input standardstdin) dan bilangan bait untuk dibaca diberikan oleh tajuk panjang Kandungan.
GET disyorkan apabila menyerahkan borang "idempotent" - yang tidak 'mengubah keadaan dunia dengan ketara'. Dengan kata lain, bentuk yang melibatkan pertanyaan pangkalan data sahaja. Perspektif lain ialah beberapa pertanyaan idempotent akan mempunyai kesan yang sama seperti pertanyaan tunggal. Sekiranya kemas kini pangkalan data atau tindakan lain seperti mencetuskan e-mel terlibat, penggunaan POST adalah disyorkan.
Dari blog pemaju Dropbox:
pelayar tidak tahu apa bentuk HTML tertentu, tetapi jika borang diserahkan melalui HTTP GET, penyemak imbas tahu selamat untuk mencuba semula secara automatik jika terdapat ralat rangkaian. Untuk borang yang menggunakan HTTP POST, ia mungkin tidak selamat untuk mencuba supaya penyemak imbas meminta pengguna untuk pengesahan terlebih dahulu.
Permintaan "GET" sering dikosongkan, sedangkan permintaan "POST" tidak boleh. Untuk sistem pertanyaan, ini mungkin mempunyai kesan kecekapan yang besar, terutamanya jika rentetan pertanyaan adalah mudah, kerana cache mungkin melayani pertanyaan yang paling sering.
Dalam kes tertentu, menggunakan POST disyorkan walaupun untuk pertanyaan idempotent:
Dikemaskini 15 Mei 2015: Khususnya apabila menggunakan HTTPS (HTTP lebih dari TLS / SSL), apakah POST menawarkan keselamatan lebih daripada GET?
Ini adalah soalan yang menarik. Katakan anda membuat permintaan GET ke laman web:
GET https://www.example.com/login.php?user=mickey&passwd=mini
Dengan mengandaikan bahawa sambungan Internet anda sedang dipantau, apakah maklumat mengenai permintaan ini akan tersedia kepada pengintip? Sekiranya POST digunakan, dan pengguna dan data passwd disertakan dalam pemboleh ubah POST, akan lebih selamat dalam hal sambungan HTTPS?
Jawapannya adalah tidak. Sekiranya anda membuat permintaan GET, hanya maklumat berikut akan diketahui oleh penyerang yang memantau lalu lintas web anda:
Bahagian jalan URL - iaitu, halaman sebenar yang diminta, serta parameter rentetan pertanyaan - dilindungi (disulitkan) semasa mereka "melalui dawai" iaitu, dalam perjalanan dalam perjalanan ke pelayan destinasi. Keadaan ini adalah sama untuk permintaan POST.
Sudah tentu, pelayan web cenderung untuk log seluruh URL dalam teks biasa dalam log akses mereka; jadi menghantar maklumat sensitif ke atas GET bukan idea yang baik. Ini terpakai tanpa mengira sama ada HTTP atau HTTPS digunakan.