Dalam permintaan GET HTTP , parameter dikirim sebagai string kueri :
http://example.com/page ? parameter = value & juga = yang lain
Dalam permintaan HTTP POST , parameter tidak dikirim bersama dengan URI.
Di mana nilainya? Di header permintaan? Di badan permintaan? Seperti apa bentuknya?
multipart/form-data
. Bagi mereka yang tertarik, inilah pertanyaan tentang itu .multipart/form-data
atau jika Anda bertanggung jawab atas permintaan konstruksi, ubah tipe konten keapplication/json
dan tempel teks json di tubuh http secara langsungKonten diletakkan setelah header HTTP. Format HTTP POST adalah memiliki tajuk HTTP, diikuti oleh baris kosong, diikuti oleh badan permintaan. Variabel POST disimpan sebagai pasangan kunci-nilai dalam tubuh.
Anda dapat melihat ini di konten mentah dari HTTP Post, ditunjukkan di bawah:
Anda dapat melihat ini menggunakan alat seperti Fiddler , yang dapat Anda gunakan untuk menonton permintaan HTTP mentah dan muatan respons yang dikirim melintasi kawat.
sumber
application/x-www-form-urlencoded
, yang tidak selalu terjadi.From
header di sana?From
header secara acak . IMO ada di atas sana dengan kode status HTTP 418.Jawaban singkat: dalam permintaan POST, nilai dikirim dalam "badan" permintaan. Dengan formulir web, mereka kemungkinan besar dikirim dengan jenis media
application/x-www-form-urlencoded
ataumultipart/form-data
. Bahasa pemrograman atau kerangka kerja yang telah dirancang untuk menangani permintaan web biasanya melakukan "The Right Thing ™" dengan permintaan seperti itu dan memberi Anda akses mudah ke nilai yang siap diterjemahkan (seperti$_REQUEST
atau$_POST
dalam PHP, ataucgi.FieldStorage()
,flask.request.form
dengan Python).Sekarang mari kita sedikit ngelantur, yang mungkin bisa membantu memahami perbedaannya;)
Perbedaan antara
GET
danPOST
permintaan sebagian besar bersifat semantik. Mereka juga "digunakan" secara berbeda, yang menjelaskan perbedaan dalam bagaimana nilai-nilai dilewatkan.DAPATKAN ( bagian RFC yang relevan )
Saat menjalankan
GET
permintaan, Anda meminta satu atau beberapa entitas pada server. Untuk memungkinkan klien memfilter hasilnya, ia dapat menggunakan apa yang disebut "string kueri" dari URL. String kueri adalah bagian setelah?
. Ini adalah bagian dari sintaks URI .Jadi, dari sudut pandang kode aplikasi Anda (bagian yang menerima permintaan), Anda perlu memeriksa bagian permintaan URI untuk mendapatkan akses ke nilai-nilai ini.
Perhatikan bahwa kunci dan nilai adalah bagian dari URI. Browser dapat menetapkan batas panjang URI. Standar HTTP menyatakan bahwa tidak ada batasan. Tetapi pada saat penulisan ini, kebanyakan browser jangan membatasi URI (saya tidak memiliki nilai-nilai tertentu).
GET
permintaan tidak boleh digunakan untuk mengirimkan informasi baru ke server. Terutama bukan dokumen yang lebih besar. Di situlah Anda harus menggunakanPOST
atauPUT
.POST ( bagian RFC yang relevan )
Saat menjalankan
POST
permintaan, klien sebenarnya mengirimkan dokumen baru ke host jarak jauh. Jadi, string kueri tidak (secara semantik) masuk akal. Itulah sebabnya Anda tidak memiliki akses ke mereka dalam kode aplikasi Anda.POST
sedikit lebih kompleks (dan jauh lebih fleksibel):Saat menerima permintaan POST, Anda harus selalu mengharapkan "muatan", atau, dalam istilah HTTP: badan pesan . Isi pesan itu sendiri sangat tidak berguna, karena tidak ada format standar (sejauh yang saya tahu. Mungkin aplikasi / octet-stream?). Format tubuh ditentukan oleh
Content-Type
tajuk. Saat menggunakanFORM
elemen HTML denganmethod="POST"
, ini biasanyaapplication/x-www-form-urlencoded
. Jenis lain yang sangat umum adalah multipart / formulir-data jika Anda menggunakan unggahan file. Tapi itu bisa apa saja , mulai daritext/plain
, lebih,application/json
atau bahkan kebiasaanapplication/octet-stream
.Dalam kasus apa pun, jika suatu
POST
permintaan dibuat dengan sesuatuContent-Type
yang tidak dapat ditangani oleh aplikasi, itu harus mengembalikan415
kode status .Sebagian besar bahasa pemrograman (dan / atau kerangka kerja web) menawarkan cara untuk menghapus / menyandikan isi pesan dari / ke jenis yang paling umum (seperti
application/x-www-form-urlencoded
,multipart/form-data
atauapplication/json
). Jadi itu mudah. Jenis kustom memerlukan pekerjaan yang berpotensi sedikit lebih banyak.Menggunakan dokumen penyandian formulir HTML standar sebagai contoh, aplikasi harus melakukan langkah-langkah berikut:
Content-Type
bidangnya415
kode statusSekali lagi, bahasa seperti PHP, atau kerangka kerja web untuk bahasa populer lainnya mungkin akan menangani ini untuk Anda. Pengecualian untuk ini adalah
415
kesalahan. Tidak ada kerangka kerja yang dapat memprediksi jenis konten mana yang dipilih aplikasi Anda untuk mendukung dan / atau tidak mendukung. Ini terserah kamu.PUT ( bagian RFC yang relevan )
Sebuah
PUT
permintaan cukup banyak ditangani dengan cara yang sama persis sebagaiPOST
permintaan. Perbedaan besar adalah bahwaPOST
permintaan seharusnya membiarkan server memutuskan bagaimana (dan jika sama sekali) membuat sumber daya baru. Secara historis (dari RFC2616 yang sekarang sudah usang itu adalah untuk menciptakan sumber daya baru sebagai "bawahan" (anak) dari URI di mana permintaan dikirim ke).Sebuah
PUT
permintaan kontras seharusnya "deposit" sumber daya tepatnya di URI, dan dengan tepat konten tersebut. Tidak lebih, tidak kurang. Idenya adalah bahwa klien bertanggung jawab untuk menyusun sumber daya yang lengkap sebelum "PUTting" itu. Server harus menerimanya apa adanya di URL yang diberikan.Akibatnya,
POST
permintaan biasanya tidak digunakan untuk mengganti sumber daya yang ada. SebuahPUT
permintaan dapat melakukan keduanya membuat dan mengganti.Catatan Samping
Ada juga " parameter path " yang dapat digunakan untuk mengirim data tambahan ke remote, tetapi mereka sangat jarang, sehingga saya tidak akan membahas terlalu banyak detail di sini. Tapi, untuk referensi, berikut adalah kutipan dari RFC:
sumber
PUT
bagian, Anda akan melihat bahwa itu adalah idempoten.POST
sebaliknya bisa - menurut definisi - tidak bisa.POST
akan selalu membuat sumber daya baru.PUT
akan, jika ada sumber daya identik menggantinya. Jadi, jika Anda meneleponPOST
10 kali, Anda akan membuat 10 sumber daya. Jika Anda meneleponPUT
10 kali, itu akan (mungkin) hanya membuat satu. Apakah itu menjawab pertanyaan Anda?Anda tidak dapat mengetik secara langsung di bilah URL peramban.
Anda dapat melihat bagaimana data POST dikirim di Internet dengan Header HTTP Langsung misalnya. Hasilnya akan seperti itu
Dimana katanya
akan menjadi nilai posting.
sumber
Content-Length
seharusnya ada di29
sini? Itulah panjang tali yang sebenarnyausername=zurfyx&pass=password
.Jenis media standar dalam permintaan POST adalah
application/x-www-form-urlencoded
. Ini adalah format untuk penyandian pasangan nilai kunci. Kunci dapat digandakan. Setiap pasangan nilai kunci dipisahkan oleh&
karakter, dan setiap kunci dipisahkan dari nilainya oleh=
karakter.Sebagai contoh:
Dikodekan sebagai:
Ini ditempatkan di badan permintaan setelah tajuk HTTP.
sumber
Nilai formulir dalam HTTP POST dikirim dalam tubuh permintaan, dalam format yang sama dengan querystring.
Untuk informasi lebih lanjut, lihat spesifikasi .
sumber
?
contoh?application/x-www-form-urlencoded
, yang tidak selalu terjadi.Beberapa layanan web mengharuskan Anda untuk menempatkan data permintaan dan metadata secara terpisah. Misalnya fungsi jarak jauh mungkin berharap bahwa string metadata yang ditandatangani termasuk dalam URI, sementara data diposting di badan HTTP.
Permintaan POST mungkin secara semantik terlihat seperti ini:
Pendekatan ini secara logis menggabungkan QueryString dan Body-Post menggunakan satu
Content-Type
yang merupakan "parsing-instructions" untuk server web.Harap dicatat: HTTP / 1.1 dibungkus dengan
#32
(spasi) di sebelah kiri dan dengan#10
(Umpan baris) di sebelah kanan.sumber
/user/john
dan/?user=john
hanya semantik (HTTP tidak benar-benar memberikan perlakuan khusus untuk string kueri), jadi saya menganggap ini sesuai yang diharapkan. Tapi apa yang Anda maksud dengan "dibungkus oleh ruang di sebelah kiri"? Tidak ada spasi sebelum metode HTTP. Maksud Anda baris kosong untuk badan pos?...Ym04
danHTTP/1.1
dalam kode di atas. Jadi QueryString hanya tinggal di antara kata kerja dan versi protokol.?
seperti yang kami lakukan denganGET
permintaan.Pertama-tama, mari kita bedakan antara
GET
danPOST
Dapatkan: Ini adalah
HTTP
permintaan default yang dibuat ke server dan digunakan untuk mengambil data dari server dan string kueri yang muncul setelah?
dalamURI
digunakan untuk mengambil sumber daya yang unik.ini formatnya
di sini
data=value
adalah nilai string kueri yang diteruskan.POST: Digunakan untuk mengirim data ke server dengan aman sehingga apa pun yang diperlukan, ini adalah format
POST
permintaanMengapa POST over GET?
Dalam
GET
nilai yang dikirim ke server biasanya ditambahkan ke URL dasar dalam string kueri, sekarang ada 2 konsekuensi dari iniGET
permintaan yang disimpan dalam sejarah browser dengan parameter. Jadi kata sandi Anda tetap tidak terenkripsi dalam riwayat browser. Ini adalah masalah nyata bagi Facebook saat itu.URI
. Jika memiliki terlalu banyak parameter yang dikirim, Anda mungkin menerima414 Error - URI too long
Dalam hal permintaan posting, data Anda dari bidang ditambahkan ke badan sebagai gantinya. Panjang params permintaan dihitung, dan ditambahkan ke header untuk panjang konten dan tidak ada data penting yang ditambahkan langsung ke URL.
Anda dapat menggunakan bagian jaringan Alat Pengembang Google untuk melihat informasi dasar tentang bagaimana permintaan dibuat ke server.
dan Anda selalu dapat menambahkan nilai lebih di Anda
Request Headers
sepertiCache-Control
,Origin
,Accept
.sumber
HTTPS
koneksi, tidakHTTP
.HTTPS
mengenkripsi baikURL
(termasuk permintaan params) danRequest Body
, ketikaHTTP
mengenkripsi / melindungi keduanya. Masalah yang dijelaskan berasal dari fakta bahwa banyak peramban menyimpanURIs
(termasukURLs
) dalam basis data riwayat mereka (biasanya tidak dienkripsi). Jadi, gunakan hanyaRequest Body
+HTTPS
untuk apa pun yang sensitif.