Metode HTTP mana yang cocok dengan metode CRUD mana?

213

Dalam pemrograman gaya RESTful, kita harus menggunakan metode HTTP sebagai blok bangunan kita. Saya agak bingung metode mana yang cocok dengan metode CRUD klasik. DAPATKAN / Baca dan HAPUS / Hapus sudah cukup jelas.

Namun, apa perbedaan antara PUT / POST? Apakah mereka cocok satu lawan satu dengan Buat dan Perbarui?

Drew
sumber

Jawaban:

298
Create = PUT with a new URI
         POST to a base URI returning a newly created URI
Read   = GET
Update = PUT with an existing URI
Delete = DELETE

PUT dapat memetakan ke Buat dan Pembaruan tergantung pada keberadaan URI yang digunakan dengan PUT.

POST map to Create.

Koreksi: POST juga dapat memetakan ke Pembaruan meskipun biasanya digunakan untuk Buat. POST juga bisa berupa pembaruan parsial sehingga kita tidak memerlukan metode PATCH yang diusulkan.

Paul Morgan
sumber
16
+1: Perbedaan yang Anda buat antara PUT untuk membuat sumber daya yang namanya (URI) ditugaskan oleh klien dan POST untuk membuat sumber daya yang namanya ditugaskan oleh server adalah penting. Lihat Richardson dan Ruby's Restful Web Services (O'Reilly) untuk diskusi tentang itu.
Jim Ferrans
9
Dan karena PUT dan DELETE belum didukung oleh peramban web, dianggap oke untuk "membebani POST" dengan menambahkan argumen string kueri seperti metode = PUT atau metode = HAPUS pada URI yang diposkan.
Jim Ferrans
2
Analisis bagus jcalcote.wordpress.com/2008/10/16/…
Boris Ivanov
13
@JimFerrans PUT dan DELETE didukung oleh browser web dengan baik, dengan XHR. Namun, dalam konteks formulir HTML, spesifikasi HTML tidak mendukungnya sehingga browser tidak dapat melakukannya.
eis
3
Meskipun tidak kanonis pemetaan untuk surat di CRUD, banyak kerangka SISA juga menggunakan GET / badan / ke Daftar entitas tipe entitas . GET / entitas / id akan membaca entitas tertentu yang cocok dengan id .
Toddius Zho
49

Seluruh kunci adalah apakah Anda melakukan perubahan idempoten atau tidak. Artinya, jika mengambil tindakan pada pesan dua kali akan menghasilkan "hal yang sama" berada di sana seolah-olah itu hanya dilakukan sekali, Anda punya perubahan idempoten dan itu harus dipetakan ke PUT. Jika tidak, itu peta ke POST. Jika Anda tidak pernah mengizinkan klien untuk mensintesis URL, PUT cukup dekat dengan Pembaruan dan POST dapat menangani Buat saja, tapi itu jelas bukan satu-satunya cara untuk melakukannya; jika klien tahu bahwa ia ingin membuat /foo/abcdan tahu konten apa yang akan diletakkan di sana, itu berfungsi dengan baik sebagai PUT.

Deskripsi kanonik POST adalah ketika Anda berkomitmen untuk membeli sesuatu: itu adalah tindakan yang tidak ingin diulangi oleh siapa pun tanpa mengetahuinya. Sebaliknya, pengaturan alamat pengiriman untuk pesanan sebelumnya dapat dilakukan dengan PUT: tidak masalah jika Anda disuruh mengirim 6 Anywhere Dr, Nowherevillesekali, dua atau seratus kali: masih alamat yang sama. Apakah itu berarti itu pembaruan? Bisa jadi ... Itu semua tergantung pada bagaimana Anda ingin menulis back-end. (Perhatikan bahwa hasilnya mungkin tidak identik: Anda dapat melaporkan kembali ke pengguna ketika mereka terakhir melakukan PUT sebagai bagian dari representasi sumber daya, yang akan memastikan bahwa PUT berulang tidak menyebabkan hasil yang identik, tetapi hasilnya tetap menjadi "sama" dalam arti fungsional.)

Donal Fellows
sumber
1
Perbedaan antara kasus penggunaan ini POSTdan PUTyang menarik, dan harus membuat jawaban untuk "Yang 'buat' dan yang 'diperbarui'?" jauh lebih jelas. Selanjutnya, berkenaan dengan implementasi API, itu akan berarti bahwa repetitif PUTharus berjumlah ke no-op diam, sedangkan repetitif POSTmungkin melemparkan pengecualian jika beberapa aspek dari data yang dikirim seharusnya tetap unik di penyimpanan data. yang mendukung aplikasi.
zerobandwidth
2
Jawaban & komentar berikut ini memunculkan poin penting, bahwa kehati - hatian harus dilakukan dalam menyamakan CRUD dengan erat (1to1) dengan semantik HTTP REST. Ini bukan pemetaan kanonik.
Martin Spamer
35

Saya sedang mencari jawaban yang sama, inilah yang dikatakan IBM. IBM Link

POST            Creates a new resource.
GET             Retrieves a resource.
PUT             Updates an existing resource.
DELETE          Deletes a resource.
ex0b1t
sumber
10

Saat ini (2016) kata kerja HTTP terbaru adalah GET, POST, PATCH , PUT dan DELETE

Gambaran

  • HTTP DAPATKAN - PILIH / Permintaan
  • PUT HTTP - PEMBARUAN
  • HTTP POST - INSERT / Buat
  • HTTP PATCH - Ketika PUT ting representasi sumber daya lengkap rumit dan menggunakan lebih banyak bandwidth, misalnya: ketika Anda harus memperbarui sebagian kolom
  • HAPUS HTTP - HAPUS

Semoga ini membantu!

Jika Anda tertarik untuk merancang API REST, ini adalah bacaan baru untuk dimiliki! repositori github versi situs web online

d1jhoni1b
sumber
1
Pada Feb '18, perlu diketahui bahwa PATCH tidak diimplementasikan secara menyeluruh di pustaka klien dan server.
Dizzley
oh ok, terima kasih ya ... maukah Anda mengirim tautan / referensi sehingga saya dapat melihatnya?
d1jhoni1b
9

Ada pembicaraan video youtube yang luar biasa oleh stormpath dengan benar-benar menjelaskan hal ini, URL harus melewati bagian video yang benar:

badai video youtube

Juga ada baiknya menonton lebih dari satu jam berbicara tetapi sangat menarik jika Anda berpikir untuk menginvestasikan waktu dalam membangun api REST.

lentur
sumber
7

Itu tergantung pada situasi konkret .. tetapi secara umum:

PUT = perbarui atau ubah sumber daya konkret dengan URI sumber daya konkret.

POST = buat sumber daya baru di bawah sumber URI yang diberikan.

Yaitu

Edit posting blog:

PUT: / blog / entri / 1

Buat yang baru:

POST: / blog / entri

PUT dapat membuat sumber daya baru dalam beberapa keadaan di mana URI sumber daya baru jelas sebelum permintaan. POST dapat digunakan untuk mengimplementasikan beberapa kasus penggunaan lain juga, yang tidak ditanggung oleh yang lain (DAPATKAN, PUT, HAPUS, KEPALA, OPSI)

Pemahaman umum untuk sistem CRUD adalah GET = request, POST = create, Put = update, DELETE = delete

Terjebak
sumber
4

Blok bangunan REST terutama adalah sumber daya (dan URI) dan hypermedia. Dalam konteks ini, GETadalah cara untuk mendapatkan representasi dari sumber daya (yang memang dapat dipetakan ke aSELECT dalam istilah CRUD).

Namun, Anda seharusnya tidak mengharapkan pemetaan satu-ke-satu antara operasi CRUD dan kata kerja HTTP. Perbedaan utama antara PUTdan POSTadalah tentang properti idempoten mereka. POSTjuga lebih umum digunakan untuk pembaruan parsial, sepertiPUT secara umum menyiratkan mengirimkan representasi penuh baru dari sumber daya.

Saya sarankan membaca ini:

The spesifikasi HTTP juga merupakan referensi yang berguna:

Metode PUT meminta entitas terlampir disimpan di bawah Request-URI yang disediakan.

[...]

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 ingin agar permintaan diterapkan ke URI yang berbeda,

Bruno
sumber
3

Secara umum, ini adalah pola yang saya gunakan:

  • HTTP DAPATKAN - PILIH / Permintaan
  • PUT HTTP - PEMBARUAN
  • HTTP POST - INSERT / Buat
  • HAPUS HTTP - HAPUS
AJ.
sumber
5
PUT dan POST tidak sama persis dengan Pembaruan atau Buat; PUT adalah "set" (yaitu, di mana Anda tahu nama sumber daya sebelumnya dan memberikan nilai untuk digunakan) dan POST adalah segalanya. Kuncinya adalah memikirkan apakah yang Anda lakukan idempoten atau tidak.
Donal Fellows
1
Memberi +1 pada komentar. Asumsi pemetaan absolut antara keduanya bisa menyesatkan. Operasi HTTP DELETE ke beberapa URI, misalnya mungkin hanya memodifikasi (yaitu, UPDATE) catatan sisi server sehingga operasi HTTP GET pada tidak lagi mengembalikan representasi.
berdiri
4
PUT dan POST tidak sama persis dengan Pembaruan atau Buat . Benar tapi AJ menggambarkan pola apa yang dia gunakan.
Piotr Dobrogost
1

Proyek Symfony mencoba untuk menjaga agar metode HTTPnya tetap tergabung dengan metode CRUD, dan daftar mereka mengaitkannya sebagai berikut:

  • DAPATKAN Ambil sumber daya dari server
  • POST Buat sumber daya di server
  • PUT Perbarui sumber daya di server
  • HAPUS Hapus sumber daya dari server

Perlu dicatat bahwa, seperti yang mereka katakan di halaman itu, "Pada kenyataannya, banyak browser modern tidak mendukung metode PUT dan DELETE."

Dari apa yang saya ingat, Symfony "memalsukan" PUT dan DELETE untuk browser-browser yang tidak mendukung mereka ketika membuat formulirnya, untuk mencoba sedekat mungkin menggunakan metode HTTP yang benar secara teoritis bahkan ketika browser tidak mendukung Itu.

Matt Gibson
sumber