Layanan MVC dan RESTful API

12

MVC cukup mudah. Ada Model, Pengontrol dan Tampilan. Saat kami membuat situs web, semuanya datang bersamaan karena ' klien mengirimkan permintaan kata kunci REST ke server -> server mencocokkan URL yang diminta dengan tindakan pengontrol -> yang kemudian memanggil model untuk pengumpulan / pemrosesan data, dapatkan hasilnya -> dan mengembalikan hasilnya kembali ke klien sebagai halaman HTML (tampilan) '.

Bagaimana jika kita berbicara tentang layanan web API RESTful murni? Kemudian alur dengan sesuatu seperti ' klien mengirimkan permintaan kata kunci REST ke server -> server mencocokkan URL yang diminta dengan tindakan pengontrol -> yang kemudian memanggil model untuk pengumpulan / pemrosesan data, mendapatkan hasil -> dan mengembalikan hasilnya kembali ke klien di JSON '. Sama seperti sebelumnya, tetapi tidak ada 'tampilan' ... atau lebih tepatnya, JSON yang dihasilkan dapat dianggap sebagai 'tampilan'. Dalam arti tertentu, kami hanya menggunakan bagian MC dari MVC. Apakah itu yang harus dilakukan? Atau apakah ada pola lain yang lebih cocok untuk layanan API saja daripada MVC?

simon
sumber

Jawaban:

21

MVC adalah paradigma dari dunia Smalltalk terkait dengan bagaimana sistem berorientasi objek bisa memiliki UI.

Kerangka kerja web awal mengambil ide umum (memisahkan logika bisnis, mengendalikan logika dan melihat logika) dan menerapkan prinsip bagaimana mereka menyusun aplikasi web. Sebelumnya, bukan hal yang aneh jika Tuhan membuat kekacauan kode pembuatan HTML di dalam objek domain, atau logika bisnis di dalam templat HTML (pikirkan PHP yang sangat awal)

Masalahnya adalah bahwa MVC asli dari dunia Smalltalk tidak benar-benar seperti apa MVC dalam kebanyakan kerangka kerja web. Output HTML sebenarnya bukan "tampilan" dalam arti Smalltalk memahami layar UI.

Jadi itu adalah alasan pertama untuk tidak terlalu terpaku pada apakah Anda mengikuti MVC dengan benar. Hampir tidak ada apa-apa. Anggap itu kurang sebagai divisi yang ketat dan lebih sebagai pedoman Hei, alangkah baiknya jika template HTML kita tidak penuh dengan logika bisnis.

MVC kedua hanyalah cara menyusun kode sisi server. Ini benar-benar tidak ada hubungannya dengan REST / HTTP. REST memperhatikan bagaimana klien dan server berkomunikasi. Tidak peduli apakah representasi server mengirim ke klien dalam templat HTML yang membutuhkan banyak untuk membangun dengan mesin templating, atau objek JSON yang merupakan satu panggilan di controller.

Jika Anda tidak berpikir server Anda membutuhkan lapisan "tampilan" yang baik-baik saja. Anda masih akan mendapatkan keuntungan dengan memisahkan logika bisnis Anda (yaitu model) dari pengontrol yang menangani permintaan HTTP tertentu, bahkan jika semua pengontrol melakukan itu panggilan panggilan parsing JSON pada beberapa objek dan mengembalikan data itu.

Cormac Mulhall
sumber
Persis apa yang perlu saya dengar. Saya berasal dari dunia dev web (sepanjang skrip satu file), jadi saya belum melihat bagaimana aplikasi skala besar non-web terstruktur secara usus. Sistem yang saya laksanakan saat ini melampaui aplikasi web biasa. Jadi dari apa yang saya baca sejauh ini, tidak masalah bagaimana Anda menyusun sumber aplikasi, tujuan utamanya adalah membuatnya mudah dinavigasi dan dipelihara. Saya akan menggunakan konsep dari pola MVC untuk menyusun aplikasi saya. Terima kasih!
simon
@lime ... tujuan utamanya adalah membuatnya mudah dinavigasi dan dipelihara. Bukankah itu selalu tujuannya?
Andy
@ David Packer tentu saja =) Saya terlalu terkunci pada sebuah konsep, kehilangan penggunaan nyata dari konsep itu.
simon
1
Lihat presentasi Bob Martin tentang Arsitektur Bersih jika Anda ingin melihat cara yang berbeda, berpotensi lebih baik untuk menyusun aplikasi daripada cara banyak kerangka kerja web lakukan.
Cormac Mulhall
9

View adalah lapisan yang bertanggung jawab untuk menampilkan informasi yang dapat ditafsirkan oleh pengguna / klien dari aplikasi Anda (itu tidak mengatakan pengguna harus menjadi orang yang sebenarnya). JSON adalah format yang benar-benar valid untuk lapisan tampilan, komputer memahaminya.

Selama lapisan tampilan menerbitkan informasi yang dapat digunakan oleh pengguna untuk memengaruhi model dalam aplikasi Anda, tidak masalah bagaimana tampilan itu terlihat, itu masih merupakan tampilan, lapisan yang bertindak sebagai middleware antara pengguna dan sistem .

Andy
sumber
2

MVC cukup mudah.

Martin Fowler mungkin, akan, tidak setuju dengan ini :

Orang yang berbeda yang membaca tentang MVC di tempat berbeda mengambil ide yang berbeda darinya dan menggambarkannya sebagai 'MVC'.

Bergerak...

Saat kami membuat situs web, semuanya datang bersamaan karena 'klien mengirimkan permintaan kata kunci REST ke server -> server mencocokkan URL yang diminta dengan tindakan pengontrol -> yang kemudian memanggil model untuk pengumpulan / pemrosesan data, dapatkan hasilnya -> dan mengembalikan hasilnya kembali ke klien sebagai halaman HTML (tampilan) '.

OK, ini agak kusut

MVC, apa pun itu, adalah kumpulan ide untuk mengimplementasikan antarmuka pengguna.

REST adalah kumpulan kendala arsitektur untuk membangun aplikasi skala besar.

Web, yang Anda bicarakan di sini, adalah aplikasi manajemen dokumen raksasa yang dibangun menggunakan sebagian besar kendala yang sama.

Kesamaan yang Anda lihat di antara keduanya adalah (pilihlah) dikaitkan salah, atau dangkal.

RESTafarian memiliki pemahaman yang sama tentang HATEOAS , "hypertext sebagai mesin negara aplikasi", dan yang seharusnya mengirim alarm berbunyi melalui kepala Anda - mengapa pandangan menjadi mesin negara ? Jika kita mempertanyakan premis, dan mencari bukti tambahan, kita mungkin juga memperhatikan dua hal aneh.

Pertama, kita dapat mengambil server HTTP sepenuhnya dari persamaan dengan memuat HTML dari disk. Browser sangat puas dengan ini, memaafkan beberapa variasi kecil dalam perilaku yang mungkin timbul dari perubahan url dasar. Tampilan umumnya tidak terus berfungsi ketika mereka telah benar-benar terputus dari model dan pengontrol seperti itu.

Kedua, jika kita mengamati browser modern dengan cermat, kita akan melihat bahwa ada beberapa tampilan HTML. Beberapa tampilan tampilan sepertinya ide yang sangat aneh, tapi cukup pasti ada presentasi utama, dengan sekelompok markup teks yang menanggapi gerakan pengguna, dan kemudian ada hal ini "Tampilan Sumber" yang menunjukkan HTML mentah dan juga menanggapi gerakan pengguna. Ini kura-kura sepanjang jalan!

Jawaban atas teka-teki itu, tentu saja, adalah bahwa HTML bukan tampilan. Kumpulan widget di browser adalah tampilan, dan mereka berkomunikasi dengan Document Object Model , yang diinisialisasi dengan membaca HTML.

Dengan kata lain, HTML adalah representasi negara, seperti yang dijanjikan Roy T. Fielding .

Bagaimana jika kita berbicara tentang layanan web API RESTful murni ...? Sama seperti sebelumnya, tetapi tidak ada 'tampilan'

Lebih tepatnya, sama seperti sebelumnya: tidak ada tampilan. JSON, seperti halnya HTML, adalah representasi dari negara, cocok untuk melintasi batas proses.

Pikirkan "DTO" atau "Pesan" dan kesimpulan Anda akan jauh lebih kecil kemungkinannya untuk menyesatkan Anda.

VoiceOfUnreason
sumber
Saya telah menggabungkan permintaan web dengan pola arsitektur untuk lebih mudah menggambarkan apa yang mengganggu saya dalam konsep secara keseluruhan. Anda mengatakan: "Kumpulan widget di browser adalah tampilan" - lalu saya ulangi: bagaimana jika tidak ada 'browser' dalam lingkup manusia? Bagaimana jika itu robot lain yang terhubung ke layanan? Jika JSON dan HTML adalah representasi negara, maka 'pesan' atau 'DTO' adalah transportasi untuk representasi negara. Jadi di mana 'pandangan' muncul? Anda semakin membingungkan saya dengan jawaban Anda.
simon
Program / robot yang terhubung ke layanan mungkin akan memanipulasi model secara langsung - mengapa perlu dilihat?
VoiceOfUnreason
1

Apakah itu yang harus dilakukan?

Melewati JSON sebagai tampilan, atau menggunakannya sebagai model tampilan untuk membangun tampilan tidak melanggar pola.

Saya menggunakan arsitektur yang sama dalam aplikasi saat ini yang sedang saya kerjakan dan itu bekerja dengan sangat baik. Bersama dengan beberapa kerangka kerja JS yang bagus, Anda dapat membuat beberapa desain yang sangat responsif.

Atau apakah ada pola lain yang lebih cocok untuk layanan API saja daripada MVC?

Jujur saja, tidak tahu. Tapi saya pikir apakah Anda menggunakan MVC atau tidak di API tidak begitu penting. Gunakan apa pun yang Anda rasa nyaman. Ketika berbicara tentang layanan web, ada banyak aspek yang lebih penting untuk dipertimbangkan (yang tidak terkait langsung dengan MVC), misalnya keamanan, konsistensi, ketersediaan, dll.

djvuk
sumber