Saya telah membaca tentang strategi pembuatan versi untuk ReST API, dan sesuatu yang tampaknya tidak ditangani oleh mereka adalah bagaimana Anda mengelola basis kode yang mendasarinya.
Katakanlah kita membuat banyak perubahan yang merusak pada API - misalnya, mengubah sumber daya Pelanggan kita sehingga mengembalikan bidang forename
dan surname
bukan satu name
bidang. (Untuk contoh ini, saya akan menggunakan solusi pembuatan versi URL karena mudah untuk memahami konsep yang terlibat, tetapi pertanyaannya juga berlaku untuk negosiasi konten atau header HTTP kustom)
Kami sekarang memiliki titik akhir di http://api.mycompany.com/v1/customers/{id}
, dan titik akhir lain yang tidak kompatibel di http://api.mycompany.com/v2/customers/{id}
. Kami masih merilis perbaikan bug dan pembaruan keamanan untuk v1 API, tetapi pengembangan fitur baru sekarang semuanya berfokus pada v2. Bagaimana kita menulis, menguji dan menerapkan perubahan ke server API kita? Saya dapat melihat setidaknya dua solusi:
Gunakan cabang / tag kontrol sumber untuk basis kode v1. v1 dan v2 dikembangkan, dan diterapkan secara independen, dengan gabungan kontrol revisi yang digunakan seperlunya untuk menerapkan perbaikan bug yang sama ke kedua versi - serupa dengan cara Anda mengelola basis kode untuk aplikasi asli saat mengembangkan versi baru utama sambil tetap mendukung versi sebelumnya.
Buat basis kode itu sendiri mengetahui versi API, sehingga Anda mendapatkan satu basis kode yang menyertakan representasi pelanggan v1 dan representasi pelanggan v2. Perlakukan pembuatan versi sebagai bagian dari arsitektur solusi Anda, bukan masalah penerapan - mungkin menggunakan beberapa kombinasi namespace dan perutean untuk memastikan permintaan ditangani oleh versi yang benar.
Keuntungan nyata dari model cabang adalah bahwa mudah untuk menghapus versi API lama - cukup hentikan penerapan cabang / tag yang sesuai - tetapi jika Anda menjalankan beberapa versi, Anda bisa berakhir dengan struktur cabang dan pipeline penerapan yang sangat berbelit-belit. Model "basis kode terpadu" menghindari masalah ini, tetapi (menurut saya?) Akan jauh lebih sulit untuk menghapus sumber daya dan titik akhir yang tidak digunakan lagi dari basis kode saat tidak lagi diperlukan. Saya tahu ini mungkin subjektif karena tidak mungkin ada jawaban sederhana yang benar, tetapi saya ingin tahu bagaimana organisasi yang mengelola API kompleks di berbagai versi memecahkan masalah ini.