Perbedaan antara REST dan CRUD

168

Saya belajar REST dan rasanya seperti CRUD (dari apa yang saya baca tentang CRUD).

Saya tahu mereka berbeda, dan saya bertanya-tanya apakah berpikir mereka mirip berarti saya tidak mengerti mereka.

Apakah REST itu "superset" dari CRUD? Apakah semuanya CRUD lakukan dan banyak lagi?

Jesse Black
sumber
17
Berpikir mereka berarti serupa yang Anda lakukan memahami mereka. Dalam membaca jawaban, saya melihat tingkat yang mengejutkan dan apa yang saya anggap tidak benar karena tidak mengakui kesamaan antara konsep. Saya percaya bahwa cara yang benar untuk memahami REST adalah dengan menganggapnya sebagai "CRUD untuk sumber daya HTTP". Jika Anda memahami apa itu sumber daya HTTP (tidak sama dengan catatan basis data) dan Anda tahu apa itu CRUD, maka gambarkan REST sebagai "CRUD untuk sumber daya HTTP" adalah cara yang benar dan ringkas untuk menyampaikan esensi REST.
Jason Livesay

Jawaban:

205

Yang mengejutkan, dalam jawaban lain saya tidak melihat apa yang saya anggap sebagai perbedaan nyata antara REST dan CRUD: apa yang masing-masing kelola.

CRUD berarti operasi dasar yang harus dilakukan dalam repositori data. Anda langsung menangani catatan atau objek data; terlepas dari operasi ini, catatan adalah entitas pasif. Biasanya itu hanya tabel dan catatan basis data.

REST, di sisi lain, beroperasi pada representasi sumber daya, masing-masing diidentifikasi oleh URL. Ini biasanya bukan objek data, tetapi abstraksi objek kompleks.

Misalnya, sumber daya dapat berupa komentar pengguna. Itu berarti tidak hanya catatan dalam tabel 'komentar', tetapi juga hubungannya dengan sumber daya 'pengguna', posting yang dilampirkan komentar, mungkin komentar lain yang ditanggapi.

Beroperasi pada komentar bukanlah operasi basis data primitif, ini dapat memiliki efek samping yang signifikan, seperti menyalakan peringatan ke poster asli, atau menghitung ulang beberapa 'poin' seperti permainan, atau memperbarui beberapa 'aliran pengikut'.

Juga, representasi sumber daya termasuk hypertext (periksa prinsip HATEOAS ), yang memungkinkan perancang untuk mengekspresikan hubungan antara sumber daya, atau membimbing klien REST dalam alur kerja operasi.

Singkatnya, CRUD adalah serangkaian operasi primitif (kebanyakan untuk basis data dan penyimpanan data statis), sementara REST adalah gaya API tingkat sangat tinggi (kebanyakan untuk layanan web dan sistem 'langsung' lainnya).

Yang pertama memanipulasi data dasar, yang lain berinteraksi dengan sistem yang kompleks.

Javier
sumber
3
@ Javier Terima kasih telah memisahkan mereka. Saya menggunakan REST learning Rails dan saya mendapat kesan itu adalah pengganti CRUD (yang saya pelajari sejak ... nama itu, saya sudah menggunakannya, hanya tidak tahu harus menyebutnya apa) ... Anda mengubah REST vs CRUD dari membandingkan 2 apel dengan membandingkan apel dan jeruk. Terima kasih
Jesse Black
2
@Maudicus: saya pikir ini sangat umum, karena RoR menyertakan lapisan CRUD (seperti kebanyakan (setiap?) Kerangka kerja), dan membuatnya mudah (otomatis?) Untuk menambahkan REST API di atas itu, mudah untuk berpikir itu semua apa REST. Tetapi kemudian Anda dapat menambahkan fungsionalitas di atas CRUD tetapi di belakang API REST, menjadikannya semakin berbeda.
Javier
1
Jawaban Anda benar, tetapi contohnya tidak optimal: komentar dapat berubah menjadi satu baris db, dan apakah tidak mungkin untuk menerapkan perubahan dinamis ke objek terkait dengan pemicu db? Saya merasa ada sedikit lebih dari sekedar operasi kasar di api yang tenang, dan jawaban Anda jelas membawa perasaan itu dengan baik.
didierc
2
Jadi ... hal yang sama, layer berbeda :)
AlikElzin-kilaka
Terima kasih banyak telah mengungkapkan ini! Saya akan menambahkan bahwa pembatasan kata kerja HTTP untuk operasi CRUD menghasilkan penerapan REST secara harfiah sebagai CRUD, dengan banyak alat yang menggeneralisasi pelat baja CRUD dan kehilangan tempat untuk kebiasaan ini "beroperasi berdasarkan komentar" logika.
sompylasar
99

Pertama-tama, keduanya adalah inisial yang umum; mereka tidak perlu ditakuti.

Sekarang, CRUD adalah istilah sederhana yang disingkat karena itu adalah fitur umum di banyak aplikasi, dan lebih mudah untuk mengatakan CRUD . Ini menggambarkan 4 operasi dasar yang dapat Anda lakukan pada data (atau sumber daya). Buat, Baca, Perbarui, Hapus.

Namun REST, adalah praktik bernama (seperti AJAX), bukan teknologi itu sendiri. Ini mendorong penggunaan kemampuan yang telah lama melekat dalam protokol HTTP, tetapi jarang digunakan.

Ketika Anda memiliki URL (Uniform Resource Locator ) dan mengarahkan browser Anda ke sana melalui baris alamat, Anda mengirim permintaan HTTP . Setiap permintaan HTTP berisi informasi yang dapat digunakan server untuk mengetahui respons HTTP mana yang harus dikirim kembali ke klien yang mengeluarkan permintaan.

Setiap permintaan berisi URL, sehingga server tahu sumber daya mana yang ingin Anda akses, tetapi juga bisa berisi metode . Metode menjelaskan apa yang harus dilakukan dengan sumber daya itu.

Tetapi konsep "metode" ini tidak terlalu sering digunakan.

Biasanya, orang hanya akan menautkan ke halaman melalui metode GET, dan mengeluarkan segala jenis pembaruan (penghapusan, penyisipan, pembaruan) melalui metode POST.

Dan karena itu Anda tidak dapat memperlakukan satu sumber daya (URL) sebagai sumber daya yang sebenarnya. Anda harus memiliki URL terpisah untuk dihapus, disisipkan, atau diperbarui dari sumber yang sama. Sebagai contoh:

http://...com/posts/create- POST request  -> Goes to posts.create() method in the server
http://...com/posts/1/show- GET request  -> Goes to posts.show(1) method in the server
http://...com/posts/1/delete - POST request  -> Goes to posts.delete(1) method in the server
http://...com/posts/1/edit- POST request  -> Goes to posts.edit(1) method in the server

Dengan REST, Anda membuat formulir yang lebih pintar karena mereka menggunakan metode HTTP lain selain POST, dan program server Anda untuk dapat membedakan antara metode , bukan hanya URL. Jadi misalnya:

http://...com/posts - POST request  -> Goes to posts.create() method in the server
http://...com/posts/1 - GET request  -> Goes to posts.show(1) method in the server
http://...com/posts/1 - DELETE request  -> Goes to posts.delete(1) method in the server
http://...com/posts/1 - PUT request  -> Goes to posts.edit(1) method in the server

Ingat, satu URL menjelaskan satu sumber daya. Satu pos adalah sumber tunggal. Dengan REST Anda memperlakukan sumber daya dengan cara yang seharusnya diperlakukan. Anda memberi tahu server sumber daya mana yang ingin Anda tangani, dan cara menanganinya.

Ada banyak fitur lain untuk "RESTful architecture", yang dapat Anda baca di Wikipedia, artikel atau buku lain, jika Anda tertarik. Di sisi lain, tidak banyak yang bisa dilakukan CRUD.

Yam Marcovic
sumber
4
Maaf, tapi SISA adalah lebih banyak daripada CRUD. sebagian besar karena sumber daya mewujudkan lebih dari satu catatan tunggal, dan setiap operasi melakukan lebih dari memperbarui catatan.
Javier
11
Baik. Saya setuju. Kenapa kamu minta maaf Saya tidak mengatakan bahwa itu tidak lebih dari CRUD. Saya pikir itulah yang saya lakukan katakan.
Yam Marcovic
4
Ini harus menjadi jawaban yang tepat.
Brandon
Spesifikasi HTML hanya memungkinkan metode GET dan POST untuk pengiriman formulir, sehingga metode lain tidak digunakan dalam layanan yang menangani permintaan dari klien web sebelum AJAX menjadi luas. Beberapa layanan menggunakan bidang input tersembunyi dengan nama "_method" sebagai solusi untuk menentukan metode selain POST sementara masih mengirimkan formulir menggunakan metode POST.
Kenneth Sundqvist
20

REST adalah singkatan dari "transfer negara representasional", yang berarti ini semua tentang berkomunikasi dan memodifikasi keadaan beberapa sumber daya dalam suatu sistem.

REST cukup terlibat, karena teori di balik REST masuk ke dalam media pengungkit, hypermedia, dan protokol yang mendasari untuk mengelola informasi pada sistem jarak jauh.

CRUD, di sisi lain, adalah mnemonik untuk operasi umum yang Anda butuhkan untuk data dalam database: Buat Retrieve Update Delete. Tapi itu benar-benar tidak lebih dalam dari itu.

Jadi itulah jawaban untuk pertanyaan Anda, tetapi saya akan menyebutkan kesalahan umum yang saya lihat ketika REST dan CRUD dibahas bersama. Banyak pengembang ingin memetakan REST ke CRUD secara langsung, karena REST melalui HTTP menyediakan GET PUT POST dan DELETE, sementara CRUD menyediakan CREATE RETRIEVE UPDATE DELETE DELETE. Wajar jika ingin memetakan kata kerja REST langsung ke operasi CRUD.

Namun, HTTP menggunakan gaya "buat atau perbarui", sementara CRUD memisahkan buat dan perbarui. Itu membuat (!) Mustahil untuk membuat pemetaan umum yang bersih antara keduanya (!)

GET dan DELETE mudah ... GET === RETRIEVE, dan DELETE === DELETE.

Tetapi per spec HTTP, PUT sebenarnya adalah Buat DAN Perbarui:

  • Gunakan PUT untuk membuat objek baru ketika Anda tahu segalanya tentangnya, termasuk pengenalnya

  • Gunakan PUT untuk memperbarui objek (biasanya dengan representasi objek yang lengkap)

POST adalah kata kerja "processing", dan dianggap sebagai kata kerja "append":

  • Gunakan POST untuk menambahkan objek baru ke koleksi - yaitu, buat objek baru

  • POST juga digunakan ketika tidak ada kata kerja lain yang cukup cocok, karena spesifikasi HTTP mendefinisikannya sebagai kata kerja "pemrosesan data"

  • Jika tim Anda terpaku pada POST, ingatlah bahwa seluruh WWW dibangun di atas GET dan POST;)

Jadi, meskipun ada kesamaan antara REST dan CRUD, kesalahan yang saya lihat kebanyakan tim lakukan adalah membuat persamaan di antara keduanya. Sebuah tim benar-benar perlu berhati-hati ketika mendefinisikan REST API untuk tidak terlalu terpaku pada mnemonic CRUD, karena REST sebagai praktik benar-benar memiliki banyak kompleksitas tambahan yang tidak dapat dipetakan dengan rapi ke CRUD.

rampok
sumber
7

CRUD menentukan satu set minimal kata kerja penyimpanan dasar untuk membaca dan menulis data: buat, baca, perbarui dan hapus. Kemudian, Anda dapat membangun operasi lain dengan menggabungkan ini. Ini biasanya dianggap operasi basis data, tetapi apa yang dianggap sebagai basis data adalah arbitrer (mis., Bisa berupa DBMS relasional, tetapi bisa juga berupa file YAML).

REST adalah "gaya arsitektur" yang biasanya mencakup operasi CRUD dan operasi lain yang lebih tinggi, semua harus dilakukan pada beberapa konsep "sumber daya" (sewenang-wenang, tetapi ini adalah entitas dalam aplikasi Anda). REST memiliki banyak kendala yang membuatnya menarik (dan khususnya dipasangkan dengan HTTP).

Antarmuka REST dapat, tetapi tidak harus, memaparkan semua operasi CRUD pada sumber daya tertentu. Apa yang tersedia di antarmuka REST adalah arbitrer dan dapat berubah karena izin sistem, pertimbangan UI, dan seberapa panasnya pada hari antarmuka dirancang dan dibuat. Hari-hari yang lebih panas mengarah ke antarmuka yang lebih minimalis, biasanya, meskipun yang terjadi adalah sebaliknya.

Dan Rosenstark
sumber
Terima kasih Yar. Sepertinya saya "Apakah semua yang CRUD lakukan dan lebih?" adalah ya, dengan teknis REST berlaku untuk lebih dari sekadar entri dalam database.
Jesse Black
@Micicus Saya memperbarui jawabannya, tetapi lebih spesifik: itu bisa tetapi TIDAK HARUS.
Dan Rosenstark
Saya tidak akan mengatakan bahwa mereka diharuskan untuk aplikasi Anda dianggap lengkap. Beberapa aplikasi tidak memerlukan penyisipan, penghapusan, atau pembaruan, secara alami.
Yam Marcovic
@Yam Marcovic, oke, disesuaikan
Dan Rosenstark
6

CRUD

  • CRUD adalah empat tipe dasar perintah SQL: Buat, Baca, Perbarui, dan Hapus
  • Sebagian besar aplikasi memiliki semacam fungsi CRUD
  • Aplikasi CRUD adalah yang menggunakan formulir untuk mendapatkan data masuk dan keluar dari database

BERISTIRAHAT

  • REST adalah singkatan dari Representational State Transfer. (Kadang-kadang dieja "ReST")

  • Itu bergantung pada protokol komunikasi statable, client-server, cacheable - dan dalam hampir semua kasus, protokol HTTP digunakan

  • REST adalah gaya arsitektur untuk merancang aplikasi jaringan

Vayodya Tamari
sumber
2

REST adalah sesuatu seperti halaman web untuk mesin, yang dapat mereka telusuri, sementara CRUD adalah sesuatu seperti SOAP, yang sangat digabungkan dengan kliennya. Inilah perbedaan utama. Ofc. mereka serupa di permukaan, tetapi CRUD menjelaskan manipulasi entitas dasar, sementara REST dapat menggambarkan antarmuka aplikasi apa pun. Perbedaan lain yang REST dapat menggunakan lebih dari 4 metode HTTP. Ini akan menjadi jawaban yang sangat panjang jika saya ingin mengumpulkan semua perbedaan, jika Anda memeriksa pertanyaan tentang REST vs SOAP, maka Anda akan menemukan sebagian besar dari mereka.

Saya pikir REST yang membingungkan dengan CRUD adalah kesalahan yang sangat umum dan penyebabnya adalah bahwa pengembang tidak punya waktu untuk membaca tentang REST secara mendalam. Mereka hanya ingin menggunakan teknologi - tanpa memahaminya - berdasarkan contoh gaya CRUD terbatas yang ditulis oleh pengembang serupa. Sebagian besar contoh dan tutorial mencerminkan kurangnya pengetahuan yang serius. Memetakan sumber daya REST ke entitas dan metode HTTP ke operasi CRUD dari entitas ini dan menggunakan REST tanpa hyperlink hanyalah gejala dari itu. Dengan REST Anda memetakan hyperlink (termasuk tautan dengan metode POST / PUT / DELETE / PATCH) ke operasi Anda dan Anda mengidentifikasi operasi di sisi klien dengan memeriksa hubungan tautan (biasanya API khusus). Jika klien REST tidak tahu apa hubungan tautan itu, dan hanya tahu metode HTTP dan mungkin beberapa templat URI, maka itu bukan klien REST, tetapi CRUD pada klien HTTP. Kesalahan umum lainnya bahwa klien REST adalah aplikasi javascript satu halaman yang berjalan di browser. Tentu saja Anda dapat mengimplementasikan klien semacam itu, tetapi REST dimaksudkan terutama untuk klien otomatis (aplikasi sisi server yang ditulis oleh pengembang yang bahkan tidak Anda kenal) dan bukan untuk klien manual (aplikasi browser yang dikendalikan pengguna ditulis oleh Anda). Memiliki hanya satu klien browser mungkin merupakan pertanda bahwa Anda tidak benar-benar membutuhkan REST dan Anda hanya perlu terlalu banyak mengubah proyek. Dalam kasus ini, API CRUD adalah solusi yang layak dan pengembang menyebut API CRUD ini sebagai REST, karena mereka tidak tahu bedanya. Tentu saja Anda dapat mengimplementasikan klien semacam itu, tetapi REST dimaksudkan terutama untuk klien otomatis (aplikasi sisi server yang ditulis oleh pengembang yang bahkan tidak Anda kenal) dan bukan untuk klien manual (aplikasi browser yang dikendalikan pengguna ditulis oleh Anda). Memiliki hanya satu klien browser mungkin merupakan pertanda bahwa Anda tidak benar-benar membutuhkan REST dan Anda hanya perlu terlalu banyak mengubah proyek. Dalam kasus ini, API CRUD adalah solusi yang layak dan pengembang menyebut API CRUD ini sebagai REST, karena mereka tidak tahu bedanya. Tentu saja Anda dapat mengimplementasikan klien semacam itu, tetapi REST dimaksudkan terutama untuk klien otomatis (aplikasi sisi server yang ditulis oleh pengembang yang bahkan tidak Anda kenal) dan bukan untuk klien manual (aplikasi browser yang dikendalikan pengguna ditulis oleh Anda). Memiliki hanya satu klien browser mungkin merupakan pertanda bahwa Anda tidak benar-benar membutuhkan REST dan Anda hanya perlu terlalu banyak mengubah proyek. Dalam kasus ini, API CRUD adalah solusi yang layak dan pengembang menyebut API CRUD ini sebagai REST, karena mereka tidak tahu bedanya.

inf3rno
sumber