Saya akan mengajukan pertanyaan ini dengan cara ini - apa masalah rekayasa perangkat lunak untuk tidak mengimplementasikan REST API saya dengan cara yang "benar"?
Apa maksud Anda dengan cara yang "benar"? Baiklah, izinkan saya untuk menjelaskan persepsi saya tentang cara yang benar, maka saya akan memberitahu Anda bagaimana saya melakukannya (juga, anggap saya berbicara tentang API SISA JSON).
Jalan yang benar
Kewarganegaraan. Ini adalah bagian yang saya dapatkan. Klien mempertahankan negara selalu 100% waktu selamanya. Itu bukan pekerjaan server, itu adalah klien.
Tindakan dan respons yang diharapkan untuk setiap kata kerja:
- DAPATKAN - Mendapat sumber daya yang ditentukan secara penuh penuh, hanya dibatasi oleh otorisasi dalam permintaan atau parameter kueri. Ini tidak menjamin modifikasi sumber daya apa pun dalam proses.
- POST - Diberikan seluruh deskripsi sumber daya (seperti objek JSON), membuat sumber daya, lalu mengembalikan sumber daya itu, dengan properti sisi server apa pun juga dibuat, seperti tanggal atau ID.
- HAPUS - Menghapus sumber daya yang ditentukan, hanya memberikan semacam 200 OK sebagai tanggapan
- PUT - Diberikan seluruh deklarasi objek sebagai input, memperbarui sumber daya di lokasi tertentu, memperbarui semua bidang sumber daya untuk setiap bidang yang diberikan dalam input. Agar jelas, ini mengharapkan seluruh objek untuk diteruskan sebagai input. Seluruh sumber daya yang diperbarui dikembalikan, dengan semua bidang (sesuai dengan otorisasi atau tanda input lainnya).
- PATCH - Hanya diberikan bidang yang ingin dimodifikasi untuk sumber daya, memperbarui hanya bidang dalam sumber daya tertentu yang diberikan sebagai input. (Di sinilah saya tidak jelas): Seluruh sumber daya dikembalikan? (Atau hanya bidang yang diperbarui? Entahlah. Tidak peduli.)
- Jalur sumber daya. Mengingat hubungan sumber daya satu sama lain, jalur sumber daya mungkin terlihat seperti salah satu dari:
- / parentresource /: id
- / parentresource /: id / childresource
- / parentresource /: id / childresource /: childId
- / parentresource /: id / childresource /: childId / subresource /: subresourceId (Dalam contoh ini, sub-sumber daya adalah milik sumber daya anak, yang termasuk dalam sumber daya induk).
Cara saya ingin melakukannya
Di atas adalah pemahaman saya tentang bagaimana seharusnya REST API berfungsi. Sekarang izinkan saya mendaftar beberapa variasi saya di atas:
- PUT / PATCH - Apa gunanya melewati seluruh sumber daya untuk modifikasi? Saya hanya menggunakan PUT untuk memodifikasi sumber daya, dan saya hanya meneruskan bidang yang ingin saya perbarui. Akibatnya, saya tidak perlu menggunakan PATCH
Resource Paths - Saya menggunakan GUID dalam aplikasi saya. Akibatnya, mereka akan menjadi unik secara global. Mengapa saya memerlukan jalur sumber daya penuh, termasuk sumber daya induk, jika saya bisa merujuk sumber daya secara unik saja? Seperti:
/ subresource /: subresourceId
Jika saya harus melakukannya dengan "benar", mencoba untuk referensi subresource akan memerlukan path lengkap seperti:
/ parentresource /: id / childresource /: childId / subresource /: subresourceId
Apakah semua yang diperlukan ? Karena sekarang saya harus memiliki penanganan kesalahan tambahan jika jalur saya berisi: subresourceId yang sebenarnya tidak dimiliki oleh yang diberikan: childId, dan ditto untuk: childId tidak dimiliki oleh induk: id. Sisi server saya mengurus otorisasi sumber daya. Tidak bisakah saya hanya merujuk sumber daya itu sendiri, daripada path lengkap?Respon balik. Katakanlah, misalnya, bahwa struktur data saya adalah hierarki pohon, tanpa batas praktis pada kedalaman pohon. Sumber daya terletak pada tingkat yang berbeda di bawah pohon, secara hierarkis.
- GET jelas. Jika saya mendapatkan seluruh pohon ini, saya mengharapkan seluruh pohon sebagai tanggapan, dengan sumber daya yang terkandung dalam sumber daya.
- Jika saya POST untuk membuat sumber daya baru, PUT untuk memperbarui, atau HAPUS untuk menghapus, saya ingin melihat delta di pohon, daripada hanya melihat sumber daya yang saya buat / perbarui / hapus. Saya tidak ingin harus lagi memanggil GET dari pohon induk setelah setiap POST, PUT, atau DELETE, terutama jika ada sedikit perubahan pada pohon dan saya hanya ingin melihat delta.
Semoga pertanyaan saya jelas.
Jika Anda melihat implementasi REST seperti yang saya jelaskan, akankah Anda melihatnya dan memberi tahu saya tentang masalah rekayasa perangkat lunak Anda? Jika demikian, apa jadinya mereka?