Kami memiliki URL dalam format berikut
/ instance / {instanceType} / {instanceId}
Anda dapat menyebutnya dengan metode HTTP standar: POST, GET, DELETE, PUT. Namun, ada beberapa tindakan lain yang kami ambil seperti "Simpan sebagai konsep" atau "Kurator"
Kami pikir kami bisa menggunakan metode HTTP khusus seperti: DRAFT, VALIDATE, CURATE
Saya pikir ini dapat diterima karena standar mengatakan
"Seperangkat metode umum untuk HTTP / 1.1 didefinisikan di bawah ini. Meskipun set ini dapat diperluas, metode tambahan tidak dapat diasumsikan untuk berbagi semantik yang sama untuk klien dan server yang diperluas secara terpisah."
Dan alat-alat seperti WebDav membuat beberapa ekstensi mereka sendiri.
Apakah ada masalah yang dialami seseorang dengan metode khusus? Saya sedang memikirkan server proxy dan firewall tetapi ada bidang lain yang menjadi perhatian. Haruskah saya tetap di sisi aman dan hanya memiliki parameter URL seperti action = validate | curate | draft?
Jawaban:
Salah satu kendala yang mendasar dari HTTP dan yang fitur desain pusat REST adalah antarmuka seragam yang disediakan oleh (antara lain) satu set, tetap kecil metode yang berlaku universal untuk semua sumber daya. Kendala antarmuka yang seragam memiliki sejumlah kelebihan dan kekurangan. Saya mengutip dari Fielding secara bebas di sini.
Antarmuka yang seragam:
Di sisi lain, antarmuka yang seragam:
Pengorbanan "dirancang untuk kasus umum Web" dan telah memungkinkan ekosistem besar yang akan dibangun yang memberikan solusi untuk banyak masalah umum dalam arsitektur web. Mematuhi antarmuka yang seragam akan memungkinkan sistem Anda mengambil manfaat dari ekosistem ini sementara memecahnya akan membuatnya menjadi sulit. Anda mungkin ingin menggunakan load balancer seperti nginx tetapi sekarang Anda hanya bisa menggunakan load balancer yang mengerti DRAFT dan CURATE. Anda mungkin ingin menggunakan lapisan cache HTTP seperti Varnish tetapi sekarang Anda hanya dapat menggunakan lapisan cache HTTP yang memahami DRAFT dan CURATE. Anda mungkin ingin meminta bantuan seseorang untuk memecahkan masalah kegagalan server tetapi tidak ada orang lain yang tahu semantik untuk permintaan CURATE. Mungkin sulit untuk mengubah perpustakaan klien atau server pilihan Anda untuk memahami dan menerapkan metode baru dengan benar. Dan seterusnya.
Cara * yang benar untuk mewakili ini adalah sebagai transformasi negara pada sumber daya (atau sumber daya terkait). Anda tidak DRAFT pos, Anda mengubah
draft
keadaannyatrue
atau Anda membuatdraft
sumber daya yang berisi perubahan dan tautan ke versi konsep sebelumnya. Anda tidak MENCIPTAKAN sebuah posting, Anda mengubah statusnyacurated
menjaditrue
atau membuatcuration
sumber daya yang menghubungkan postingan dengan pengguna yang membuat itu.* Benar karena mengikuti prinsip arsitektur REST.
sumber
Saya lebih suka merancang ini sebagai sub-sumber daya, di mana Anda melakukan permintaan POST.
Anggap Anda memiliki sumber daya
/instance/type/1
, saya akan meminta perwakilan sumber daya tersebut menyampaikan beberapa tautan ke 'tindakan' yang dapat dilakukan pada sumber daya tersebut, seperti/instance/type/1/draft
dan/instance/type/1/curate
. Di JSON, ini bisa sesederhana:Ini memungkinkan klien untuk menjadi sangat eksplisit tentang apa yang perlu terjadi, selama permintaan POST ke tautan yang disediakan oleh
curate
anggota. Sumber daya yang diposting di sana dapat mencakup argumen yang merinci acara yang akan, mungkin, menimbulkan transisi negara.Pergi dengan pendekatan 'naif' untuk bergerak di antara negara-negara yang mungkin menggunakan sumber daya memiliki kelemahan karena tidak menangkap peristiwa apa yang menyebabkan transisi ini.
Transisi keadaan biasanya terjadi sebagai respons terhadap peristiwa tertentu, dan saya lebih suka menangkap peristiwa itu daripada membiarkan klien memutuskan bahwa ada sesuatu yang sekarang dalam 'keadaan' tertentu. Itu juga membuat validasi jauh lebih sulit. Plus, Anda tidak akan dapat menangkap 'argumen' apa pun kecuali Anda mendeskripsikannya di negara bagian itu sendiri. Dan kemudian semuanya menjadi menjengkelkan ketika beberapa kode mengubah kode-kode itu tanpa transisi keadaan sebenarnya, dan validasi diperlukan, dan semuanya dengan cepat menjadi berantakan.
sumber
/vms/some-id
mengembalikan tautan ke tindakan sepertiPOST /vms/some-id/restart
dan kami menggunakannya untuk menentukan apakah tindakan harus diaktifkan atau dinonaktifkan. Saya memiliki hubungan cinta / benci dengan HATEOAS :)Saya pikir metode HTTP khusus adalah cara terbaik untuk menerapkan tindakan entitas. Menambahkan tindakan ke badan entitas (POST) tampaknya tidak benar, itu bukan bagian dari entitas Anda (walaupun hasilnya mungkin disimpan di dalamnya). Juga, menggunakan proksi metode HTTP khusus dapat menentukan tindakan mereka tanpa perlu mem-parsing badan entitas.
Ini seperti CRUD, Anda selalu ingin mengimplementasikannya, tetapi Anda juga memiliki serangkaian tindakan spesifik (per enitity). Saya benar-benar tidak melihat apa yang menjadi masalah dalam memperpanjangnya.
Juga @Rein Henrichs "Anda tidak DRAFT pos, Anda mengubah keadaan konsepnya menjadi benar atau Anda membuat sumber daya konsep" tampaknya salah bagi saya. Sebuah
drafts
properti akan digunakan untuk terus-menerus menyimpan negara, bukan untuk membuat transformasi. Tindakan bahkan tidak selalu menghasilkan 'keadaan', atau disimpan di properti. Membuat entitas yang terpisah untuk setiap keadaan / transformasi tampaknya bahkan lebih kabur. Cobalah untuk mempertahankan referensi yang sama (URI) dengan enity.sumber