Bagaimana cara menggambarkan perubahan arsitektur yang sengaja melanggar standar REST?

37

Saya mengusulkan perubahan pada proyek perangkat lunak yang dirancang dengan buruk yang mengalami banyak masalah. Pada tingkat tinggi, proyek ini menggunakan Angular di front-end dan menggunakan berbagai API REST; itu semua hebat (saya tidak melihat perlunya mengubah teknologi atau alat kami). Masalahnya adalah bahwa basis kode secara proporsional lebih besar di UI daripada API sisi server. Sebagian besar logika bisnis tinggal di UI, dengan REST API menjadi antarmuka basis data CRUD sederhana ke lapisan UI.

Misalnya, POST ke pelanggan akan membuat catatan pelanggan, sementara PUT akan mengubah pelanggan itu. Tidak lebih, dan tidak sedikit. Namun logika bisnis kami lebih menuntut dari itu. Proses umum menciptakan pelanggan tidak lebih dari memasukkan 1 catatan basis data. Ini akan menyediakan data dalam tabel lain yang diperlukan, melakukan validasi dan perhitungan tertentu, dll. Saya lebih suka untuk membuat panggilan POST / PUT tunggal yang merangkum semua perilaku ini, meringankan beban klien yang mengonsumsi.

Jadi sudut pandang saya adalah orkestrasi menyeluruh ini harus hidup di server (di mana kami memiliki kontrol penuh, log, dll), bukan UI, tetapi satu argumen berlawanan adalah bahwa pendekatan ini tidak lagi tenang. Jadi saya tidak yakin bagaimana cara terbaik menggambarkan pendekatan ini ketika rekomendasi saya adalah untuk melanjutkan dengan tumpukan teknologi yang ada, tetapi menerapkan perubahan mendasar di lokasi di mana kode berada.

Ben Harrison
sumber
44
Mengurung API Anda untuk panggilan CRUD demi menjadikannya "Tenang" adalah pertukaran yang buruk.
Robert Harvey
38
@EsbenSkovPedersen: Best Friend Forever?
Robert Harvey
5
Alih-alih mengkhawatirkan apakah layanan Anda sesuai dengan REST (iirc, hampir tidak ada), saya lebih khawatir tentang menyesuaikan diri dengan spesifikasi HTTP . Sebagian besar api yang telah saya kerjakan juga tidak sesuai dengan spesifikasi, tapi itu adalah tujuan yang lebih dapat dicapai dan berharga.
aaaaaa
7
@aaaaaa, alasan hampir tidak ada layanan yang sesuai dengan REST adalah karena tidak ada yang bisa memutuskan apa itu REST. Satu-satunya titik kesepakatan yang saya temukan adalah "semua orang melakukan kesalahan".
Tandai
16
- "Bagaimana cara menggambarkan perubahan arsitektur yang sengaja melanggar standar REST?" - DisRESTpect . ( Maaf untuk komentar tidak profesional, itu lebih kuat dari saya. )
luk32

Jawaban:

49

Saya tidak yakin bagaimana cara terbaik menggambarkan pendekatan ini ketika rekomendasi saya adalah untuk melanjutkan dengan tumpukan teknologi yang ada, tetapi menerapkan perubahan mendasar di lokasi di mana kode berada.

Service oriented architecture.

Anda mengusulkan untuk mendesain ulang sistem Anda sehingga aturan bisnis dan data Anda berada di tempat yang sama. Itu secara efektif definisi layanan ; lihat pembicaraan Udi Dahan tentang Menemukan Batas Layanan .

Bilah samping: seperti dicatat oleh Eric, ini tidak ada hubungannya dengan "REST". Sama sekali tidak ada alasan bahwa Anda tidak dapat menempatkan REST API (artinya, API yang memenuhi batasan gaya arsitektur REST ) di depan layanan Anda. Tapi itu mungkin tidak jelas bagi orang-orang yang mengerti REST berarti pemetaan operasi basis data dengan metode HTTP.

Mungkin, atau mungkin tidak, layak untuk berinvestasi dalam mengubah pemahaman audiens Anda tentang REST.

VoiceOfUnreason
sumber
32
Juga tidak layak berinvestasi di REST sama sekali. Jika Anda membaca disertasi Roy Fielding (atau Bagaimana saya menjelaskan REST kepada istri saya ), tujuan sebenarnya dari REST adalah untuk menyediakan representasi kanonik untuk sumber daya di Internet, sehingga mesin yang berbeda di internet akan memiliki cara standar untuk memanipulasi sumber daya tersebut. . Aplikasi milik pribadi bahkan mungkin tidak memerlukan kemampuan ini.
Robert Harvey
29

REST bukan CRUD. "Tandingan" itu didasarkan pada pemahaman yang cacat secara fundamental tentang apa itu REST. Saya belum melihat apa pun di pos Anda yang menunjukkan bahwa perubahan Anda akan membuat API Anda lebih atau kurang TETAP.

Eric Stein
sumber
6
Ya, tidak, ini bukan pemetaan yang sempurna untuk CRUD, tetapi ia berjalan dan berbicara dan bernyanyi sangat banyak seperti CRUD, setidaknya dalam cara kebanyakan orang menafsirkannya.
Robert Harvey
11
@ RobertTarvey Saya pikir itu (mis) pemahaman itulah masalahnya di sini.
JimmyJames
4
@ JimmyJames: Ini adalah kesalahpahaman yang meluas. Ada dorongan kuat untuk membuat hal-hal "tenang" ketika kebanyakan orang bahkan tidak mengerti apa manfaatnya atau bagaimana manfaat itu berlaku untuk mereka.
Robert Harvey
4
@ RobertTarvey Saya pikir Anda mengatakan bahwa jika melakukannya dengan cara yang salah adalah REST, maka REST seharusnya tidak menjadi tujuan. OK tapi cara saya melihatnya, menyebut ini 'bukan REST' adalah omong kosong dan saya pendukung besar menyebut omong kosong di omong kosong. Kata-kata membutuhkan makna yang dipahami secara umum agar bermanfaat.
JimmyJames
5
@RobertHarvey Diberikan tetapi itu tidak akan terjadi selama ada cukup banyak orang yang bersedia memperbaiki penyalahgunaan istilah ini. Saya belum siap untuk menyerah.
JimmyJames
24

Satu hal lagi yang perlu diingat adalah sebagai berikut ... Tidak memvalidasi sisi server aturan bisnis Anda, berarti Anda secara implisit memercayai apa pun yang masuk, melalui katakanlah permintaan POST, valid.

Artinya, misalnya, sementara aplikasi sudut Anda mungkin memeriksa apakah pelanggan memiliki rentang usia yang valid dan memastikan bahwa pengguna yang sah mendapatkan umpan balik yang benar, siapa pun yang mengetahui url ke api Anda dapat melakukan permintaan POST yang berisi beberapa nilai tidak sah yang akan tidak lagi divalidasi.

Jadi saran saya adalah memindahkan aturan bisnis Anda ke API, membiarkannya memvalidasi input dan mengembalikan kesalahan yang sesuai (atau mungkin hanya kode yang menunjukkan apa yang salah) di badan respons. Kode-kode itu kemudian dapat digunakan oleh aplikasi front-end Anda untuk menunjukkan apa yang salah.

mrsmn
sumber
5
Sejauh ini, inilah jawaban yang paling berguna di sini: API adalah permukaan serangan, bukan input ke klien. Permintaan API apa pun dapat dipalsukan. Dengan demikian, apa pun yang dapat dilakukan dengan API murni adalah apa yang dapat dilakukan oleh kiddie skrip yang tidak berbakat dan berbahaya. Perangkat lunak klien dapat digunakan untuk memberikan pengalaman pengguna yang lebih baik, tetapi itu adalah server yang perlu menegakkan aturan.
cmaster
10

Untuk menambah jawaban baik lainnya di sini:

Antarmuka Anda, REST atau sebaliknya, tidak boleh dibatasi berdasarkan semacam asumsi seputar detail implementasi. Ini sepenuhnya bertentangan dengan gagasan layanan sebagai lapisan abstraksi.

Salah satu manfaat utama menggunakan layanan adalah detail implementasi dapat diubah tanpa klien harus melakukan apa pun. Dari apa yang telah Anda jelaskan, sepertinya tidak ada lapisan abstraksi nyata. Detail implementasi telah diekspos melalui HTTP. Tidak ada apapun tentang REST yang perlu, membantu, atau diinginkan. Bahkan, saya pikir saya bisa berdebat bagian-bagian tertentu dari definisi REST berarti bahwa ini sebenarnya, implementasi non-TENANG.

Apa yang Anda sarankan adalah bagaimana lapisan layanan yang tepat harus dirancang. Jika seseorang mengatakan kepada Anda bahwa Anda tidak dapat melakukannya karena itu tidak tenang, itu disayangkan. Anda dapat yakin bahwa seseorang yang memberi tahu Anda yang tidak tahu banyak tentang REST.

Berdasarkan pertanyaan Anda, Anda memiliki sumber daya yang disebut pelanggan. Apa pun dan segala sesuatu yang diperlukan untuk membuat sumber daya pelanggan yang valid dapat dan harus ditangani dalamPOST ke sumber daya basis pelanggan (atau secara bergantian / opsional dalam PUT ke sumber daya pelanggan tertentu, jika tidak ada.) REST tidak mengatakan apa-apa tentang berapa banyak catatan basis data yang perlu Anda buat pada panggilan yang diberikan. Seperti komentar Colin Young, tidak perlu ada database sama sekali, itu sama sekali tidak relevan bagaimana layanan diimplementasikan dari perspektif REST.

JimmyJames
sumber
3
REST tidak mengatakan apa-apa tentang catatan basis data, apalagi berapa. Saya bisa membuat layanan REST yang mengendalikan katup air, dan mengekspos katup air, pasokan air, dan sumber daya level tangki. Anda bisa berargumen objek fisik itu sendiri adalah "basis data" tetapi itu sedikit meregangkan segalanya.
Colin Young
@ColinYoung Ya, terima kasih telah membantu menjelaskan.
JimmyJames
3

Ada beberapa jawaban bagus di sini, tetapi saya tidak yakin mereka akan membantu Anda meyakinkan rekan kerja Anda. Seperti yang telah ditunjukkan oleh banyak orang, apa yang Anda sarankan bukanlah bergeser dari desain RESTful, dan saya pikir itu adalah kunci untuk membuatnya sesuai dengan proposal Anda.

REST bukan tentang memastikan API Anda hanya memungkinkan menyimpan dan mengambil data. Sebaliknya, ini berkaitan dengan tindakan pemodelan sebagai sumber daya. API Anda harus mengaktifkan tindakan yang harus diambil (bagaimanapun, ini adalah Antarmuka Pemrograman Aplikasi ). Pertanyaannya adalah bagaimana memodelkan tindakan tersebut.

Daripada menggunakan istilah, contoh mungkin adalah cara terbaik untuk menjelaskan hal ini kepada rekan kerja Anda . Dengan cara ini Anda dapat menunjukkan bagaimana mereka melakukannya sekarang, masalah apa yang menyebabkannya, solusi yang memecahkan masalah, dan bagaimana itu masih TETAP.

Mari kita lihat objek Pelanggan Anda.

Masalah:

UI POST Pelanggan, tetapi tabel selanjutnya belum diperbarui. Bagaimana jika salah satu dari panggilan berikutnya gagal karena kesalahan pada kode UI Anda (atau plugin browser yang tidak sesuai, dll)? Sekarang data Anda dalam keadaan tidak konsisten. Bahkan bisa berupa keadaan yang memecah bagian lain dari API atau UI Anda, belum lagi itu hanya tidak valid. Bagaimana Anda pulih? Anda harus menguji untuk setiap keadaan yang memungkinkan untuk memastikan ini tidak akan merusak sesuatu, tetapi akan sulit untuk mengetahui apa yang mungkin.

Larutan:

Buat titik akhir API untuk membuat pelanggan. Anda tahu Anda tidak ingin memiliki titik akhir "/ pelanggan / buat" atau bahkan "/ buat-pelanggan", karena buat adalah kata kerja dan akan melanggar REST. Jadi kata benda itu. "/ penciptaan pelanggan" bisa berhasil. Sekarang ketika Anda POST objek CustomerCreation Anda, itu akan mengirim semua bidang yang diperlukan untuk pelanggan dibuat sepenuhnya. Titik akhir akan memastikan bahwa data lengkap dan valid (mengembalikan 400 atau sesuatu jika gagal validasi), dan dapat bertahan semua dalam transaksi db tunggal, misalnya.

Jika Anda juga membutuhkan titik akhir untuk MENDAPATKAN / objek pelanggan, itu bagus. Anda dapat memiliki keduanya. Caranya adalah dengan menciptakan titik akhir yang melayani kebutuhan konsumen.

Keuntungan:

  1. Anda menjamin bahwa Anda tidak akan berakhir dengan keadaan buruk
  2. Ini sebenarnya lebih mudah di devs UI jika mereka tidak harus "tahu" memesan permintaan, masalah validasi, dll
  3. Itu tidak seperti mengobrol tentang API, mengurangi latensi permintaan jaringan
  4. Lebih mudah untuk menguji dan membuat konsep skenario (potongan data yang hilang / cacat dari UI tidak tersebar di seluruh permintaan, beberapa di antaranya mungkin gagal)
  5. Ini memungkinkan enkapsulasi logika bisnis yang lebih baik
  6. Secara umum membuat keamanan lebih mudah (karena logika bisnis dan orkestrasi di UI dapat dimodifikasi oleh pengguna)
  7. Kemungkinan akan mengurangi duplikasi logika (lebih besar kemungkinan Anda akan memiliki 2+ konsumen suatu API daripada 2+ API yang memberikan akses ke data yang sama)
  8. Masih 100% tenang

Kekurangan:

  1. Ini berpotensi lebih banyak pekerjaan untuk dev backend (tetapi mungkin tidak dalam jangka panjang)

Mungkin sulit bagi orang untuk memahami paradigma ini dan apa gunanya jika mereka belum mencobanya. Semoga Anda dapat membantu mereka melihat dengan menggunakan contoh dari kode Anda sendiri.

Pengalaman saya sendiri adalah begitu para devs di tim saya mulai menerapkan strategi ini, mereka segera melihat manfaatnya.

Pelajaran lanjutan:

Artikel ini dari pemikiran benar-benar membantu saya mendapatkan ide pemodelan tindakan sebagai objek menggunakan contoh-contoh praktis: https://www.thoughtworks.com/insights/blog/rest-api-design-resource-modeling

Saya juga menyarankan membaca tentang CQRS dan Event Sourcing karena mereka berkaitan dengan hal-hal semacam ini (yaitu menceraikan API Anda dari logika kegigihan yang sebenarnya). Saya tidak tahu seberapa besar keinginan rekan kerja Anda untuk membaca hal semacam ini, tetapi hal itu dapat memberi Anda lebih banyak kejelasan dan membantu Anda menjelaskannya kepada mereka.

Papan
sumber
" Karena create adalah kata kerja dan akan melanggar REST " - Benar sekali. Dengan kata lain, itu akan menjadi pendekatan 47.258.346 untuk menjalankan " RPC over REST ". Yang merupakan sesuatu yang saya anggap paling tidak "tidak alami", karena menyalahgunakan dan salah mengartikan pendekatan yang tenang (mereka memang memiliki kasus penggunaannya, tetapi RPC bukan salah satunya) dan juga cenderung tidak efisien.
JensG