Mematikan VM melalui antarmuka REST
Ini sebenarnya adalah contoh yang agak terkenal, diajukan oleh Tim Bray pada tahun 2009 .
Roy Fielding, membahas masalah, berbagi pengamatan ini :
Saya pribadi lebih suka sistem yang memperlakukan status yang dipantau (seperti status daya) sebagai tidak dapat diedit.
Singkatnya, Anda memiliki satu sumber informasi yang mengembalikan representasi saat ini dari keadaan yang dipantau; representasi yang mungkin menyertakan tautan hypermedia ke formulir yang meminta perubahan ke negara itu, dan formulir memiliki tautan lain ke sumber daya untuk menangani (setiap) permintaan perubahan.
Seth Ladd memiliki wawasan utama dalam masalah tersebut
Kami telah mengubah Lari dari keadaan sederhana seseorang menjadi Kata benda sejati yang dapat dibuat, diperbarui, dan dibicarakan.
Membawa ini kembali ke mesin reboot. Saya berpendapat bahwa Anda akan POST ke / vdc / 434 / cluster / 4894 / server / 4343 / reboot Setelah Anda memposting, Anda memiliki URI yang mewakili reboot ini , dan Anda bisa DAPATKAN untuk pembaruan status. Melalui keajaiban hyperlinking, representasi dari Reboot terkait dengan Server yang di-reboot.
Saya pikir mencetak ruang URI lebih murah, dan URI bahkan lebih murah. Buat koleksi kegiatan, yang dimodelkan sebagai Nouns, dan POST, PUT, dan DELETE!
Pemrograman yang tenang adalah birokrasi Vogon pada skala web. Bagaimana Anda melakukan sesuatu dengan tenang? Ciptakan dokumen baru untuk itu, dan digitalkan dokumen itu.
Dalam bahasa yang agak lebih menarik, yang Anda lakukan adalah mendefinisikan protokol aplikasi domain untuk "mematikan VM", dan mengidentifikasi sumber daya yang Anda perlukan untuk mengekspos / mengimplementasikan protokol itu
Lihat contoh Anda sendiri
PATCH /api/virtualmachines/42
Content-Type:application/json
{ "state": "shutting down" }
Tidak apa-apa; Anda tidak benar-benar memperlakukan permintaan itu sendiri sebagai sumber informasi terpisah, tetapi Anda masih bisa mengaturnya.
Anda telah sedikit ketinggalan dalam representasi perubahan Anda.
Dengan PATCH, bagaimanapun, entitas terlampir berisi serangkaian instruksi yang menggambarkan bagaimana sumber daya yang saat ini berada di server asal harus dimodifikasi untuk menghasilkan versi baru.
Misalnya, tipe media JSON Patch memformat instruksi seolah-olah Anda secara langsung memodifikasi dokumen JSON
[
{ "op": "replace", "path": "state", "value": "shutting down" }
]
Dalam alternatif Anda, idenya dekat, tetapi tidak jelas benar. PUT
adalah penggantian lengkap status sumber daya di URL target , jadi Anda mungkin tidak akan memilih ejaan yang terlihat seperti koleksi sebagai target representasi entitas tunggal .
POST /api/virtualmachines/42/actions
Konsisten dengan fiksi bahwa kami menambahkan tindakan ke antrian
PUT /api/virtualmachines/42/latestAction
Konsisten dengan fiksi bahwa kami membuat pembaruan ke item ekor dalam antrian; agak aneh melakukannya dengan cara ini. Prinsip kejutan paling tidak merekomendasikan memberikan setiap PUT itu pengidentifikasi unik sendiri, daripada menempatkan mereka semua di satu tempat dan memodifikasi beberapa sumber daya pada saat yang sama.
Perhatikan bahwa, sejauh kita membahas ejaan URI - REST tidak peduli; /cc719e3a-c772-48ee-b0e6-09b4e7abbf8b
adalah URI cromulen sempurna sejauh REST yang bersangkutan. Keterbacaan, seperti halnya nama variabel, merupakan masalah tersendiri. Menggunakan ejaan yang konsisten dengan RFC 3986 akan membuat orang jauh lebih bahagia.
CQRS
Bagaimana jika kita memiliki domain CQRS dengan banyak "tindakan" (alias perintah) yang berpotensi menyebabkan pembaruan beberapa agregat atau tidak dapat dipetakan ke operasi CRUD pada sumber daya dan sub-sumber daya yang konkret?
Greg Young di CQRS
CQRS adalah pola yang sangat sederhana yang memungkinkan banyak peluang untuk arsitektur yang mungkin tidak ada. CQRS bukanlah konsistensi akhirnya, ini bukan acara, itu bukan perpesanan, tidak memiliki model terpisah untuk membaca dan menulis, juga tidak menggunakan sumber acara.
Ketika kebanyakan orang berbicara tentang CQRS mereka benar-benar berbicara tentang menerapkan pola CQRS ke objek yang mewakili batas layanan aplikasi.
Mengingat Anda berbicara tentang CQRS dalam konteks HTTP / REST, tampaknya masuk akal untuk menganggap Anda bekerja dalam konteks yang terakhir ini, jadi mari kita mulai dengan itu.
Yang ini, secara mengejutkan, bahkan lebih mudah daripada contoh Anda sebelumnya. Alasannya sederhana: perintah adalah pesan .
Jim Webber menggambarkan HTTP sebagai protokol aplikasi kantor tahun 1950-an; pekerjaan dilakukan dengan mengambil pesan dan memasukkannya ke dalam kotak masuk. Gagasan yang sama berlaku - kami mendapatkan salinan kosong formulir, mengisinya dengan spesifikasi yang kami tahu, mengirimkannya. Ta da
Haruskah kita mencoba memodelkan sebanyak mungkin perintah yang dibuat atau memperbarui sumber daya konkret, di mana dimungkinkan (mengikuti pendekatan pertama dari contoh I) dan menggunakan "titik akhir tindakan" untuk sisanya?
Ya, sejauh "sumber daya konkret" adalah pesan, bukan entitas dalam model domain.
Gagasan utama: API REST Anda masih merupakan antarmuka ; Anda harus dapat mengubah model yang mendasarinya tanpa klien perlu mengubah pesan. Saat Anda merilis model baru, Anda merilis versi baru titik akhir web Anda yang tahu cara mengambil protokol domain Anda dan menerapkannya ke model baru.
Apakah model CQRS lebih cocok untuk RPC seperti API?
Tidak juga - khususnya, cache web adalah contoh yang bagus dari "model baca yang akhirnya konsisten". Membuat setiap tampilan Anda dapat diatasi secara independen, masing-masing dengan aturan caching mereka sendiri, memberi Anda banyak penskalaan secara gratis. Ada sedikit daya tarik untuk pendekatan RPC eksklusif untuk membaca.
Untuk menulis, ini adalah pertanyaan penipu: mengirim semua perintah ke penangan tunggal pada titik akhir tunggal, atau satu keluarga titik akhir, tentu lebih mudah . REST benar-benar lebih tentang bagaimana Anda menemukan komunikasi di mana titik akhir adalah untuk klien.
Memperlakukan pesan sebagai sumber dayanya yang unik memiliki keuntungan bahwa Anda dapat menggunakan PUT, mengingatkan komponen perantara terhadap fakta bahwa penanganan pesan idempoten, sehingga mereka dapat berpartisipasi dalam kasus-kasus penanganan kesalahan tertentu, adalah hal yang baik untuk dimiliki . (Catatan: bahwa dari sudut pandang klien, jika sumber daya memiliki URI yang berbeda, maka mereka adalah sumber daya yang berbeda; fakta bahwa mereka semua mungkin memiliki kode penangan permintaan yang sama pada server asal adalah detail implementasi yang disembunyikan oleh seragam antarmuka).
Fielding (2008)
Saya juga harus mencatat bahwa di atas belum sepenuhnya tenang, setidaknya bagaimana saya menggunakan istilah ini. Yang saya lakukan hanyalah mendeskripsikan antarmuka layanan, yang tidak lebih dari RPC apa pun. Untuk membuatnya RESTful, saya perlu menambahkan hypertext untuk memperkenalkan dan mendefinisikan layanan, menjelaskan cara melakukan pemetaan menggunakan formulir dan / atau tautan templat, dan menyediakan kode untuk menggabungkan visualisasi dengan cara yang bermanfaat.