Jawaban:
PUT HTTP:
PUT menempatkan file atau sumber daya pada URI tertentu, dan tepat di URI itu. Jika sudah ada file atau sumber daya di URI itu, PUT menggantikan file atau sumber daya itu. Jika tidak ada file atau sumber daya di sana, PUT membuat satu. PUT idempoten , tetapi respons PUT yang paradoks tidak dapat di-cache.
HTTP POST:
POST mengirimkan data ke URI tertentu dan mengharapkan sumber daya di URI itu untuk menangani permintaan tersebut. Server web pada titik ini dapat menentukan apa yang harus dilakukan dengan data dalam konteks sumber daya yang ditentukan. Metode POST tidak idempoten , namun respons POST dapat disimpan dalam cache selama server menetapkan header Kontrol-Cache yang sesuai dan Kedaluwarsa.
HTTP RFC resmi menetapkan POST sebagai:
HTTP 1.1 Lokasi RFC untuk POST
Perbedaan antara POST dan PUT:
RFC sendiri menjelaskan perbedaan inti:
Perbedaan mendasar antara permintaan POST dan PUT tercermin dalam arti berbeda dari Request-URI. URI dalam permintaan POST mengidentifikasi sumber daya yang akan menangani entitas terlampir. Sumber daya itu bisa berupa proses penerimaan data, gateway ke beberapa protokol lain, atau entitas terpisah yang menerima anotasi. Sebaliknya, URI dalam permintaan PUT mengidentifikasi entitas yang dilampirkan dengan permintaan - agen pengguna tahu apa yang dimaksud dengan URI dan server TIDAK HARUS mencoba menerapkan permintaan tersebut ke sumber daya lain. Jika server menginginkan agar permintaan diterapkan ke URI yang berbeda, itu HARUS mengirim respons 301 (Dipindahkan Secara Permanen); agen pengguna MUNGKIN kemudian membuat keputusan sendiri mengenai apakah akan mengarahkan permintaan atau tidak.
Selain itu, dan sedikit lebih ringkas, RFC 7231 Bagian 4.3.4 PUT menyatakan (penekanan ditambahkan),
4.3.4. TARUH
Metode PUT meminta status sumber daya target menjadi
created
ataureplaced
dengan status yang ditentukan oleh representasi terlampir dalam muatan pesan permintaan.
Menggunakan metode yang benar, selain tidak terkait:
Satu keuntungan dari REST ROA vs SOAP adalah bahwa ketika menggunakan HTTP REST ROA, itu mendorong penggunaan yang tepat dari kata kerja HTTP / metode. Jadi misalnya Anda hanya akan menggunakan PUT ketika Anda ingin membuat sumber daya di lokasi yang tepat. Dan Anda tidak akan pernah menggunakan GET untuk membuat atau memodifikasi sumber daya.
If the Request-URI does not point to an existing resource [...] the origin server *can* create the resource with that URI
. Jadi implementasi PUT yang menolak untuk membuat sumber daya jika tidak ada akan benar, kan? Jika demikian, apakah ini terjadi dalam praktik? Atau implementasi biasanya juga buat di PUT?
Hanya semantik.
HTTP PUT
seharusnya menerima isi permintaan, dan kemudian menyimpannya di sumber yang diidentifikasi oleh URI.
HTTP POST
lebih umum. Seharusnya memulai tindakan di server. Tindakan itu bisa menyimpan badan permintaan di sumber yang diidentifikasi oleh URI, atau bisa juga URI yang berbeda, atau bisa juga tindakan yang berbeda.
PUT seperti unggahan file. Put ke URI mempengaruhi persis URI itu. POST ke URI dapat memiliki efek sama sekali.
Untuk memberikan contoh sumber daya gaya REST:
"POST / buku" dengan banyak informasi buku mungkin membuat buku baru, dan merespons dengan URL baru yang mengidentifikasi buku itu: "/ buku / 5".
"PUT / books / 5" harus membuat buku baru dengan id 5, atau mengganti buku yang ada dengan ID 5.
Dalam gaya non-sumber daya, POST dapat digunakan untuk apa saja yang memiliki efek samping. Satu perbedaan lain adalah bahwa PUT harus idempoten - beberapa PUT dari data yang sama ke URL yang sama harus baik-baik saja, sementara beberapa POST dapat membuat beberapa objek atau apa pun yang dilakukan tindakan POST Anda.
PUT dimaksudkan sebagai metode untuk "mengunggah" barang ke URI tertentu, atau menimpa apa yang sudah ada dalam URI itu.
POST, di sisi lain, adalah cara mengirimkan data yang TERKAIT dengan URI yang diberikan.
Lihat HTTP RFC
Sejauh yang saya tahu, PUT sebagian besar digunakan untuk memperbarui catatan.
POST - Untuk membuat dokumen atau sumber daya lainnya
PUT - Untuk memperbarui dokumen yang dibuat atau sumber daya lainnya.
Namun untuk lebih jelasnya, PUT biasanya 'Mengganti' catatan yang ada jika ada dan membuat jika tidak ada ..
Orang lain telah memposting jawaban yang sangat baik, saya hanya ingin menambahkan bahwa dengan sebagian besar bahasa, kerangka kerja, dan kasus penggunaan Anda akan berurusan dengan POST jauh lebih sering daripada PUT. Sampai-sampai PUT, DELETE, dll. Pada dasarnya adalah pertanyaan-pertanyaan sepele.
Silakan lihat: http://zacharyvoase.com/2009/07/03/http-post-put-diff/
Akhir-akhir ini saya agak terganggu oleh kesalahpahaman populer oleh pengembang web bahwa POST digunakan untuk membuat sumber daya, dan PUT digunakan untuk memperbarui / mengubahnya.
Jika Anda melihat halaman 55 RFC 2616 ("Hypertext Transfer Protocol - HTTP / 1.1"), Bagian 9.6 ("PUT"), Anda akan melihat untuk apa PUT sebenarnya:
Metode PUT meminta entitas terlampir disimpan di bawah Request-URI yang disediakan.
Ada juga paragraf praktis untuk menjelaskan perbedaan antara POST dan PUT:
Perbedaan mendasar antara permintaan POST dan PUT tercermin dalam arti berbeda dari Request-URI. URI dalam permintaan POST mengidentifikasi sumber daya yang akan menangani entitas terlampir. Sumber daya itu bisa berupa proses penerimaan data, gateway ke beberapa protokol lain, atau entitas terpisah yang menerima anotasi. Sebaliknya, URI dalam permintaan PUT mengidentifikasi entitas yang dilampirkan dengan permintaan - agen pengguna tahu apa yang dimaksud dengan URI dan server TIDAK HARUS mencoba menerapkan permintaan tersebut ke sumber daya lain.
Itu tidak menyebutkan apa-apa tentang perbedaan antara memperbarui / membuat, karena bukan itu tentang. Ini tentang perbedaan antara ini:
obj.set_attribute(value) # A POST request.
Dan ini:
obj.attribute = value # A PUT request.
Jadi tolong, hentikan penyebaran kesalahpahaman populer ini. Baca RFC Anda.
POST dianggap sesuatu dari metode jenis pabrik. Anda memasukkan data dengannya untuk membuat apa yang Anda inginkan dan apa pun yang ada di ujung sana tahu apa yang harus dilakukan dengannya. PUT digunakan untuk memperbarui data yang ada di URL yang diberikan, atau untuk membuat sesuatu yang baru ketika Anda tahu akan seperti apa URI dan itu belum ada (sebagai lawan dari POST yang akan membuat sesuatu dan mengembalikan URL ke jika perlu).
REST meminta pengembang untuk menggunakan metode HTTP secara eksplisit dan dengan cara yang konsisten dengan definisi protokol. Prinsip desain REST dasar ini menetapkan pemetaan satu-ke-satu antara membuat, membaca, memperbarui, dan menghapus operasi (CRUD) dan metode HTTP. Menurut pemetaan ini:
• Untuk membuat sumber daya di server, gunakan POST.
• Untuk mengambil sumber daya, gunakan GET.
• Untuk mengubah status sumber daya atau memperbaruinya, gunakan PUT.
• Untuk menghapus atau menghapus sumber daya, gunakan HAPUS.
Info lebih lanjut: Layanan web RESTful: Dasar-dasar dari IBM
Seharusnya cukup mudah ketika menggunakan satu atau yang lain, tetapi kata-kata yang kompleks adalah sumber kebingungan bagi banyak dari kita.
Gunakan PUT
saat Anda ingin memodifikasi sumber daya tunggal yang sudah menjadi bagian dari pengumpulan sumber daya. PUT
menggantikan sumber daya secara keseluruhan. Contoh:PUT /resources/:resourceId
Sidenote: Gunakan PATCH
jika Anda ingin memperbarui bagian dari sumber daya.
POST
saat Anda ingin menambahkan sumber daya anak di bawah kumpulan sumber daya. POST => /resources
PUT
untuk operasi UPDATE .POST
untuk operasi BUAT .GET
/ perusahaan / laporan => Dapatkan semua laporan
GET
/ perusahaan / laporan / {id} => Dapatkan informasi laporan diidentifikasi oleh "id"
POST
/ perusahaan / laporan => Buat laporan baru
PUT
/ perusahaan / laporan / {id} baru => Perbarui melaporkan informasi yang diidentifikasi oleh "id"
PATCH
/ perusahaan / laporan / {id} => Perbarui bagian dari informasi laporan yang diidentifikasi oleh "id"
DELETE
/ perusahaan / laporan / {id} => Hapus laporan dengan "id"
Perbedaan antara POST dan PUT adalah bahwa PUT idempoten, itu berarti, memanggil permintaan PUT yang sama beberapa kali akan selalu menghasilkan hasil yang sama (yang tidak ada efek samping), sementara di sisi lain, memanggil permintaan POST berulang kali mungkin terjadi ( tambahan) efek samping dari menciptakan sumber daya yang sama beberapa kali.
GET
: Permintaan menggunakan GET hanya mengambil data, yaitu meminta representasi dari sumber yang ditentukan
POST
: Ini mengirim data ke server untuk membuat sumber daya. Jenis isi permintaan ditunjukkan oleh header Jenis-Konten. Ini sering menyebabkan perubahan status atau efek samping pada server
PUT
: Membuat sumber daya baru atau mengganti representasi dari sumber daya target dengan payload permintaan
PATCH
: Ini digunakan untuk menerapkan modifikasi parsial ke sumber daya
DELETE
: Ini menghapus sumber daya yang ditentukan
TRACE
: Ini melakukan tes loop-back pesan di sepanjang jalan ke sumber daya target, menyediakan mekanisme debugging yang berguna
OPTIONS
: Ini digunakan untuk menggambarkan opsi komunikasi untuk sumber daya target, klien dapat menentukan URL untuk metode PILIHAN, atau tanda bintang (*) untuk merujuk ke seluruh server.
HEAD
: Ia meminta respons yang identik dengan permintaan GET, tetapi tanpa badan respons
CONNECT
: Ini membangun terowongan ke server yang diidentifikasi oleh sumber daya target, dapat digunakan untuk mengakses situs web yang menggunakan SSL (HTTPS)
Penggunaan ISTIRAHAT
POST
digunakan untuk membuat sumber daya baru dan kemudian mengembalikan sumber daya tersebut URI
EX
REQUEST : POST ..../books
{
"book":"booName",
"author":"authorName"
}
Panggilan ini dapat membuat buku baru dan mengembalikan buku itu URI
Response ...THE-NEW-RESOURCE-URI/books/5
PUT
digunakan untuk mengganti sumber daya, jika sumber daya itu ada maka cukup perbarui itu, tetapi jika sumber daya itu tidak ada maka buat itu,
REQUEST : PUT ..../books/5
{
"book":"booName",
"author":"authorName"
}
Dengan PUT
kami tahu pengidentifikasi sumber daya, tetapi POST
akan mengembalikan pengidentifikasi sumber daya baru
Penggunaan non-ISTIRAHAT
POST
digunakan untuk memulai tindakan di sisi server, tindakan ini mungkin atau tidak dapat membuat sumber daya, tetapi tindakan ini akan memiliki sisi yang mempengaruhi selalu akan mengubah sesuatu di server
PUT
digunakan untuk menempatkan atau mengganti konten literal di URL tertentu
Perbedaan lain dalam gaya REST-ful dan non-REST-ful
POST
adalah Operasi Non-Idempoten: Ini akan menyebabkan beberapa perubahan jika dijalankan beberapa kali dengan permintaan yang sama.
PUT
adalah Operasi Idempoten: Tidak akan memiliki efek samping jika dijalankan beberapa kali dengan permintaan yang sama.
Perlu disebutkan bahwa POST
ada beberapa serangan Pemalsuan Permintaan Situs Web (CSRF) yang umum terjadi sementara PUT
tidak.
CSRF di bawah ini tidak mungkin dilakukanPUT
ketika korban mengunjungi attackersite.com
.
The efek serangan adalah bahwa korban tidak sengaja menghapus pengguna hanya karena (korban) telah log-in sebagai admin
on target.site.com
, sebelum mengunjungi attackersite.com
:
Permintaan normal (cookie dikirim): ( PUT
bukan nilai atribut yang didukung)
Kode pada attackersite.com
:
<form id="myform" method="post" action="http://target.site.com/deleteUser" >
<input type="hidden" name="userId" value="5">
</form>
<script>document.createElement('form').submit.call(document.getElementById('myform'));</script>
Permintaan XHR (cookie dikirim): ( PUT
akan memicu permintaan preflight, yang responsnya akan mencegah browser meminta deleteUser
halaman)
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://target.site.com/deleteUser");
xhr.withCredentials=true;
xhr.send(["userId=5"]);
Dengan kata sederhana, Anda dapat mengatakan:
1.HTTP Get: Digunakan untuk mendapatkan satu atau lebih item
2.HTTP Post: Digunakan untuk membuat item
3.HTTP Put: Digunakan untuk memperbarui suatu item
4.HTTP Patch: Digunakan untuk memperbarui sebagian item
5.HTTP Delete: Digunakan untuk menghapus item
Sebenarnya tidak ada perbedaan selain gelar mereka. Sebenarnya ada perbedaan mendasar antara GET dan yang lainnya. Dengan metode "MENDAPAT" -Request, Anda mengirim data dalam url-address-line, yang dipisahkan terlebih dahulu dengan tanda tanya, dan kemudian dengan tanda &.
Tetapi dengan metode "POST" -meminta, Anda tidak bisa meneruskan data melalui url, tetapi Anda harus meneruskan data sebagai objek di "badan" permintaan. Di sisi server, Anda harus membaca isi dari konten yang diterima untuk mendapatkan data yang dikirim. Tetapi di sisi lain tidak ada kemungkinan untuk mengirim konten di dalam tubuh, ketika Anda mengirim "MENDAPATKAN" -Minta.
Klaim, bahwa "GET" hanya untuk mendapatkan data dan "POST" adalah untuk memposting data, sama sekali salah. Tidak ada yang dapat mencegah Anda membuat konten baru, menghapus konten yang ada, mengedit konten yang ada, atau melakukan apa pun di backend, berdasarkan data, yang dikirim oleh permintaan "GET" atau dengan permintaan "POST". Dan tidak ada yang bisa mencegah Anda untuk mengkodekan backend dengan cara, bahwa dengan "POST" - Permintaan, klien meminta beberapa data.
Dengan permintaan, apa pun metode yang Anda gunakan, Anda memanggil URL dan mengirim atau tidak mengirim beberapa data untuk menentukan, informasi mana yang ingin Anda sampaikan ke server untuk menangani permintaan Anda, dan kemudian klien mendapat jawaban dari server. Data dapat berisi apa pun yang ingin Anda kirim, backend diizinkan melakukan apa pun yang diinginkan dengan data dan respons dapat berisi informasi apa pun, yang ingin Anda masukkan ke sana.
Hanya ada dua METODE DASAR ini. DAPATKAN dan POST. Tapi struktur mereka, yang membuat mereka berbeda dan bukan apa yang Anda kode di backend. Di backend Anda dapat kode apa pun yang Anda inginkan, dengan data yang diterima. Tetapi dengan "POST" - permintaan Anda harus mengirim / mengambil data di tubuh dan tidak di url-addressline, dan dengan permintaan "GET", Anda harus mengirim / mengambil data di url-addressline dan tidak di tubuh. Itu saja.
Semua metode lain, seperti "PUT", "HAPUS" dan seterusnya, mereka memiliki struktur yang sama dengan "POST".
Metode POST terutama digunakan, jika Anda ingin sedikit menyembunyikan konten, karena apa pun yang Anda tulis di url-addressline, ini akan disimpan dalam cache dan GET-Method sama dengan menulis url-addressline dengan data. Jadi jika Anda ingin mengirim data sensitif, yang tidak selalu harus nama pengguna dan kata sandi, tetapi misalnya beberapa id atau hash, yang Anda tidak ingin ditampilkan di url-address-line, maka Anda harus menggunakan metode POST .
Panjang URL-Addressline juga terbatas pada 1024 simbol, sedangkan "POST" -Metode tidak dibatasi. Jadi, jika Anda memiliki jumlah data yang lebih besar, Anda mungkin tidak dapat mengirimkannya dengan Permintaan-GET, tetapi Anda harus menggunakan Permintaan-POST. Jadi ini juga merupakan nilai tambah bagi permintaan POST.
Tetapi menangani permintaan GET jauh lebih mudah, ketika Anda tidak memiliki teks yang rumit untuk dikirim. Jika tidak, dan ini merupakan nilai tambah lain untuk metode POST, adalah, bahwa dengan metode GET Anda perlu menyandikan url teks, agar dapat mengirim beberapa simbol di dalam teks atau bahkan spasi. Tetapi dengan metode POST Anda tidak memiliki batasan dan konten Anda tidak perlu diubah atau dimanipulasi dengan cara apa pun.
Baik PUT dan POST adalah Metode Istirahat.
PUT - Jika kami membuat permintaan yang sama dua kali menggunakan PUT menggunakan parameter yang sama dua kali, permintaan kedua tidak akan berpengaruh. Inilah sebabnya mengapa PUT umumnya digunakan untuk skenario Pembaruan, memanggil Pembaruan lebih dari sekali dengan parameter yang sama tidak melakukan apa-apa lebih dari panggilan awal sehingga PUT idempoten.
POST bukan idempoten, misalnya Buat akan membuat dua entri terpisah ke target maka itu bukan idempoten sehingga CREATE digunakan secara luas di POST.
Melakukan panggilan yang sama menggunakan POST dengan parameter yang sama setiap kali akan menyebabkan dua hal berbeda terjadi, maka mengapa POST umumnya digunakan untuk skenario Buat