Jawaban singkat: dalam permintaan POST, nilai dikirim dalam "badan" permintaan. Dengan formulir web, mereka kemungkinan besar dikirim dengan jenis media application/x-www-form-urlencodedatau 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 $_REQUESTatau $_POSTdalam PHP, atau cgi.FieldStorage(), flask.request.formdengan Python).
Sekarang mari kita sedikit ngelantur, yang mungkin bisa membantu memahami perbedaannya;)
Perbedaan antara GETdan POSTpermintaan sebagian besar bersifat semantik. Mereka juga "digunakan" secara berbeda, yang menjelaskan perbedaan dalam bagaimana nilai-nilai dilewatkan.
Saat menjalankan GETpermintaan, 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). GETpermintaan tidak boleh digunakan untuk mengirimkan informasi baru ke server. Terutama bukan dokumen yang lebih besar. Di situlah Anda harus menggunakan POSTatau PUT.
Saat menjalankan POSTpermintaan, 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.
POSTsedikit 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-Typetajuk. Saat menggunakan FORMelemen 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/jsonatau bahkan kebiasaan application/octet-stream.
Dalam kasus apa pun, jika suatu POSTpermintaan dibuat dengan sesuatu Content-Typeyang tidak dapat ditangani oleh aplikasi, itu harus mengembalikan 415kode 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-dataatau 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-Typebidangnya
- Jika nilainya bukan jenis media yang didukung, maka kembalikan respons dengan
415kode 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 415kesalahan. Tidak ada kerangka kerja yang dapat memprediksi jenis konten mana yang dipilih aplikasi Anda untuk mendukung dan / atau tidak mendukung. Ini terserah kamu.
Sebuah PUTpermintaan cukup banyak ditangani dengan cara yang sama persis sebagai POSTpermintaan. Perbedaan besar adalah bahwa POSTpermintaan 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 PUTpermintaan 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, POSTpermintaan biasanya tidak digunakan untuk mengganti sumber daya yang ada. Sebuah PUTpermintaan 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 .