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
atau multipart/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, atau cgi.FieldStorage()
, flask.request.form
dengan Python).
Sekarang mari kita sedikit ngelantur, yang mungkin bisa membantu memahami perbedaannya;)
Perbedaan antara GET
dan POST
permintaan sebagian besar bersifat semantik. Mereka juga "digunakan" secara berbeda, yang menjelaskan perbedaan dalam bagaimana nilai-nilai dilewatkan.
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 menggunakan POST
atau PUT
.
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 menggunakan FORM
elemen HTML dengan method="POST"
, ini biasanya application/x-www-form-urlencoded
. Jenis lain yang sangat umum adalah multipart / formulir-data jika Anda menggunakan unggahan file. Tapi itu bisa apa saja , mulai dari text/plain
, lebih, application/json
atau bahkan kebiasaan application/octet-stream
.
Dalam kasus apa pun, jika suatu POST
permintaan dibuat dengan sesuatu Content-Type
yang tidak dapat ditangani oleh aplikasi, itu harus mengembalikan 415
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
atau application/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:
- Baca
Content-Type
bidangnya
- Jika nilainya bukan jenis media yang didukung, maka kembalikan respons dengan
415
kode status
- jika tidak, dekode nilai dari badan pesan.
Sekali 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.
Sebuah PUT
permintaan cukup banyak ditangani dengan cara yang sama persis sebagai POST
permintaan. Perbedaan besar adalah bahwa POST
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. Sebuah PUT
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:
Selain dari segmen-segmen dalam jalur hierarkis, segmen jalur dianggap buram oleh sintaksis generik. Aplikasi penghasil URI sering menggunakan karakter-karakter khusus yang diperbolehkan dalam segmen untuk membatasi subkomponen khusus skema atau spesifik-handler. Misalnya, tanda titik koma (";") dan sama dengan ("=") karakter cadangan sering digunakan untuk membatasi parameter dan nilai parameter yang berlaku untuk segmen itu. Karakter khusus koma (",") sering digunakan untuk tujuan yang sama. Misalnya, satu produsen URI mungkin menggunakan segmen seperti "nama; v = 1.1" untuk menunjukkan referensi ke versi 1.1 dari "nama", sedangkan yang lain mungkin menggunakan segmen seperti "nama, 1.1" untuk menunjukkan hal yang sama. Jenis parameter dapat ditentukan oleh semantik khusus skema,
multipart/form-data
. Bagi mereka yang tertarik, inilah pertanyaan tentang itu .