Apa kegunaan metode permintaan HTTP PUT dan DELETE?

89

Saya telah membaca banyak hal tentang ini tetapi tidak bisa mendapatkan kesimpulan tentang topik ini.

Tapi saya tidak pernah menggunakan metode PUT atau DELETE HTTP Request. Kecenderungan saya adalah menggunakan GET ketika status sistem (aplikasi atau situs web saya) mungkin tidak terpengaruh (seperti daftar produk) dan menggunakan POST ketika terpengaruh (pesanan ditempatkan). Bukankah itu cukup atau saya melewatkan sesuatu?

Rupesh Patel
sumber
2
PUT / DELETE lebih mudah untuk dikodekan, tetapi lebih sulit untuk diatur (dari segi keamanan - direktori vhost / apache). Pendapat saya yang sederhana ... Anda bisa hidup tanpa itu.
Najzero
5
@Najzero ya saya sangat senang tanpa mereka :) tapi butuh jawaban mengapa mereka ada ?? telah membaca beberapa hal tetapi tidak bisa mengatasinya
Rupesh Patel

Jawaban:

88

DELETE adalah untuk menghapus sumber permintaan:

Metode DELETE meminta server asal menghapus sumber daya yang diidentifikasi oleh Request-URI. Metode ini MUNGKIN diganti oleh campur tangan manusia (atau cara lain) di server asal. Klien tidak dapat dijamin bahwa operasi telah dilakukan, meskipun kode status yang dikembalikan dari server asal menunjukkan bahwa tindakan tersebut telah berhasil diselesaikan ...

PUT adalah untuk meletakkan atau memperbarui sumber daya di server:

Metode PUT meminta agar entitas terlampir disimpan di bawah Request-URI yang disediakan. Jika Request-URI merujuk ke sumber daya yang sudah ada, entitas terlampir HARUS dianggap sebagai versi modifikasi dari yang berada di server asal. Jika Request-URI tidak mengarah ke sumber daya yang ada, dan URI tersebut mampu didefinisikan sebagai sumber daya baru oleh agen pengguna yang meminta, server asal dapat membuat sumber daya dengan URI tersebut…

Untuk spesifikasi lengkap kunjungi:

Karena browser saat ini sayangnya tidak mendukung kata kerja lain selain POST dan GET dalam bentuk HTML , Anda biasanya tidak dapat menggunakan HTTP sepenuhnya bersama mereka (Anda masih dapat membajak pengiriman mereka melalui JavaScript). Tidak adanya dukungan untuk metode ini dalam bentuk HTML menyebabkan URI berisi kata kerja, seperti misalnya

POST http://example.com/order/1/delete

atau bahkan lebih buruk

POST http://example.com/deleteOrder/id/1

secara efektif melakukan tunneling semantik CRUD melalui HTTP. Tetapi kata kerja tidak pernah dimaksudkan untuk menjadi bagian dari URI. Sebaliknya HTTP sudah menyediakan mekanisme dan semantik untuk CRUD Sumber Daya (misalnya perintah) melalui metode HTTP. HTTP adalah protokol dan bukan hanya beberapa layanan terowongan data.

Jadi untuk menghapus Resource di webserver, Anda akan menelepon

DELETE http://example.com/order/1

dan untuk memperbaruinya Anda akan menelepon

PUT http://example.com/order/1

dan memberikan Representasi Sumber Daya yang diperbarui di badan PUT agar server web dapat menerapkannya kemudian.

Jadi, jika Anda membangun semacam klien untuk REST API , kemungkinan besar Anda akan membuatnya mengirim permintaan PUT dan DELETE. Ini bisa berupa klien yang dibangun di dalam browser, misalnya mengirim permintaan melalui JavaScript atau bisa juga berupa alat yang berjalan di server, dll.

Untuk beberapa detail lebih lanjut kunjungi:

Gordon
sumber
7
Browser dapat mengirim PUT dan DELETE dengan JavaScript!
Joe
5
@ Joe Ya, tetapi metode formulir HTML tidak. Dan selama itu tidak didukung di luar kotak, Anda harus melalui rintangan untuk membuatnya bekerja. Itu salah satu kegagalan utama vendor browser.
Gordon
3
Tentu saja tidak, formulir dirancang untuk POST dan GET. Itu ada di desain HTML. Tidaklah benar untuk mengatakan bahwa PUT dan DELETE tidak didukung. Browser menerapkan HTML dan HTTP.
Joe
@Joe kita mungkin tidak memiliki definisi yang sama tentang "mendukung". Kebanyakan Browser mendukung JavaScript dan, ya, JavaScript dapat melakukan permintaan HTTP, tetapi saya masih harus memprogramnya , mengikat kode ke beberapa elemen UI dan mengirimkannya ke klien terlebih dahulu.
Gordon
4
Browser menampilkan halaman kosong kecuali Anda menulis beberapa HTML. Ya, mungkin kita harus tidak setuju. Tidak setuju tidak apa-apa!
Joe
26

Menggunakan kata kerja Permintaan HTTP seperti GET, POST, DELETE, PUT dll ... memungkinkan Anda untuk membangun aplikasi web RESTful. Baca tentang itu di sini: http://en.wikipedia.org/wiki/Representational_state_transfer

Cara termudah untuk melihat manfaat dari ini adalah dengan melihat contoh ini. Setiap kerangka kerja MVC memiliki Router/Dispatcheryang memetakan URL ke actionControllers. Jadi URL seperti ini: /blog/article/1akan memanggil blogController::articleAction($id); Sekarang Router ini hanya mengetahui URL atau/blog/article/1/

Tetapi jika Router itu akan mengetahui seluruh objek Permintaan HTTP, bukan hanya URL, ia dapat memiliki akses kata kerja Permintaan HTTP (GET, POST, PUT, DELETE ...), dan banyak hal berguna lainnya tentang Permintaan HTTP saat ini.

Itu akan memungkinkan Anda untuk mengonfigurasi aplikasi sehingga dapat menerima URL yang sama dan memetakannya ke actionControllers yang berbeda bergantung pada kata kerja Permintaan HTTP.

Sebagai contoh:

jika Anda ingin mendapatkan kembali artikel 1 Anda dapat melakukan ini:

GET /blog/article/1 HTTP/1.1

tetapi jika Anda ingin menghapus artikel 1 Anda akan melakukan ini:

DELETE /blog/article/1 HTTP/1.1

Perhatikan bahwa kedua Permintaan HTTP memiliki URI yang sama, / blog / article / 1, satu-satunya perbedaan adalah kata kerja Permintaan HTTP. Dan berdasarkan kata kerja itu, router Anda dapat memanggil actionController yang berbeda. Ini memungkinkan Anda untuk membangun URL yang rapi.

Baca dua artikel ini, mereka mungkin membantu Anda:

Symfony 2 - Dasar-dasar HTTP

Symfony 2 - Perutean

Artikel ini membahas tentang framework Symfony 2, tetapi dapat membantu Anda mengetahui cara kerja Permintaan dan Respons HTTP.

Semoga ini membantu!

Limeni
sumber
6
meskipun saya bukan teman mereka, penjelasan yang bagus +1 ;-)
Najzero
1
Jawaban ini menjelaskan cara terbaik untuk menggambarkan pentingnya kata kerja HTTP dan tetap sejalan dengan layanan yang benar-benar RESTful dan manfaatnya. Jika Anda tidak menggunakan ucapkan HTTP DELETE, Anda mungkin memiliki (2) tindakan POST di pengontrol: 1 untuk Createdan 1 untuk Delete. Jika Anda melakukan ini, pencarian Anda selanjutnya adalah " Bagaimana memiliki beberapa tindakan Posting dalam satu pengontrol ": P. Bukan berarti ini buruk, tetapi Anda kehilangan kemampuan untuk memiliki sumber daya unik yang diimplementasikan melalui tindakan kata kerja sebagai lawan harus secara eksplisit memberikan nama tindakan di URI.
atconway
3

Meskipun saya mengambil risiko tidak populer, saya katakan itu tidak berguna saat ini .

Saya pikir mereka bermaksud baik dan berguna di masa lalu ketika misalnya DELETE memberi tahu server untuk menghapus sumber daya yang ditemukan di URL yang disediakan dan PUT (dengan saudara kandungnya PATCH) memberi tahu server untuk melakukan pembaruan dengan cara idempoten.

Hal-hal berevolusi dan URL menjadi virtual (lihat penulisan ulang url misalnya) membuat sumber daya kehilangan arti awal folder / subforder / file yang sebenarnya dan karenanya, kata kerja tindakan CRUD yang dicakup oleh metode protokol HTTP (GET, POST, PUT / PATCH, DELETE) kehilangan jejak .

Mari kita ambil contoh:

  • / api / entity / list / {id} vs GET / api / entity / {id}
  • / api / entity / add / {id} vs POST / api / entity
  • / api / entity / edit / {id} vs PUT / api / entity / {id}
  • / api / entity / delete / {id} vs DELETE / api / entity / {id}

Di sisi kiri tidak tertulis metode HTTP, pada dasarnya tidak masalah (POST dan GET sudah cukup) dan di sisi kanan metode HTTP yang sesuai digunakan.

Sisi kanan terlihat elegan, bersih dan profesional. Bayangkan sekarang Anda harus mempertahankan kode yang telah menggunakan API elegan dan Anda harus mencari di mana panggilan penghapusan dilakukan. Anda akan mencari "api / entitas" dan di antara hasil Anda harus melihat mana yang melakukan DELETE. Atau lebih buruk lagi, Anda memiliki programmer junior yang secara tidak sengaja menukar PUT dengan DELETE dan karena URL adalah hal yang sama terjadi.

Menurut pendapat saya, meletakkan kata kerja tindakan di URL memiliki keunggulan dibandingkan menggunakan metode HTTP yang sesuai untuk tindakan itu meskipun tidak begitu elegan. Jika Anda ingin melihat di mana delete call dibuat, Anda hanya perlu mencari "api / entity / delete" dan Anda akan langsung menemukannya.

Membangun API tanpa seluruh larik metode HTTP membuatnya lebih mudah untuk dikonsumsi dan dipelihara setelahnya

Bogdan
sumber
1

Metode Aman: Dapatkan Sumber Daya / Tidak ada modifikasi dalam sumber daya
Idempoten: Tidak ada perubahan dalam status sumber daya jika diminta berkali-kali
Metode Tidak Aman: Buat atau Perbarui Sumber Daya / Modifikasi dalam sumber daya
Non-Idempoten: Perubahan dalam status sumber daya jika diminta berkali-kali

Sesuai dengan kebutuhan Anda:

1) Untuk operasi yang aman dan idempoten (Ambil Sumber Daya) gunakan --------- GET METHOD
2) Untuk operasi yang tidak aman dan non-idempoten (Sisipkan Sumber Daya) gunakan --------- METODE POS
3) Untuk operasi yang tidak aman dan idempoten (Perbarui Sumber Daya) gunakan --------- PUT METHOD
3) Untuk operasi yang tidak aman dan idempoten (Hapus Sumber Daya) gunakan --------- DELETE METHOD

pengguna1953168
sumber