Ini pertanyaan yang bagus dan sulit. Topik desain URI pada saat yang sama merupakan bagian yang paling menonjol dari REST API dan , oleh karena itu, komitmen jangka panjang yang potensial terhadap pengguna API tersebut .
Sejak evolusi suatu aplikasi dan, pada tingkat lebih rendah, API-nya adalah fakta kehidupan dan bahkan mirip dengan evolusi produk yang tampaknya kompleks seperti bahasa pemrograman, desain URI harus memiliki lebih sedikit kendala alami dan harus dilestarikan. lembur . Semakin lama masa pakai aplikasi dan API, semakin besar komitmen untuk pengguna aplikasi dan API.
Di sisi lain, fakta kehidupan lain adalah sulit untuk memperkirakan semua sumber daya dan aspek-aspeknya yang akan dikonsumsi melalui API. Untungnya, tidak perlu mendesain seluruh API yang akan digunakan sampai Kiamat . Cukup untuk mendefinisikan dengan benar semua titik akhir sumber daya dan skema pengalamatan dari setiap instance sumber daya dan sumber daya.
Seiring waktu Anda mungkin perlu menambahkan sumber daya baru dan atribut baru ke setiap sumber daya tertentu, tetapi metode yang diikuti pengguna API untuk mengakses sumber daya tertentu tidak boleh berubah begitu skema pengalamatan sumber daya menjadi publik dan karenanya bersifat final.
Metode ini berlaku untuk semantik kata kerja HTTP (misalnya PUT harus selalu memperbarui / mengganti) dan kode status HTTP yang didukung dalam versi API sebelumnya (mereka harus terus bekerja sehingga klien API yang telah bekerja tanpa campur tangan manusia harus dapat terus bekerja seperti itu).
Selain itu, karena memasukkan versi API ke dalam URI akan mengganggu konsep hypermedia sebagai mesin negara aplikasi (dinyatakan dalam disertasi Roy T. Fieldings PhD) dengan memiliki alamat sumber daya / URI yang akan berubah dari waktu ke waktu, saya akan menyimpulkan bahwa API versi tidak boleh disimpan dalam URI sumber daya untuk waktu yang lama yang berarti bahwa URI sumber daya yang dapat diandalkan pengguna API harus berupa tautan permanen .
Tentu, mungkin untuk menanamkan versi API di URI basis tetapi hanya untuk penggunaan yang wajar dan terbatas seperti men-debug klien API yang bekerja dengan versi API baru. API versi seperti itu harus dibatasi waktu dan hanya tersedia untuk grup terbatas pengguna API (seperti saat beta tertutup). Kalau tidak, Anda mengikat diri sendiri di tempat yang seharusnya tidak Anda lakukan.
Beberapa pemikiran tentang pemeliharaan versi API yang memiliki tanggal kedaluwarsa. Semua platform / bahasa pemrograman yang biasa digunakan untuk mengimplementasikan layanan web (Java, .NET, PHP, Perl, Rails, dll.) Memungkinkan pengikatan titik akhir layanan web dengan mudah ke URI basis. Dengan cara ini, sangat mudah untuk mengumpulkan dan menyimpan koleksi file / kelas / metode yang terpisah di berbagai versi API .
Dari pengguna API POV, itu juga lebih mudah untuk bekerja dengan dan mengikat ke versi API tertentu ketika ini jelas tetapi hanya untuk waktu yang terbatas, yaitu selama pengembangan.
Dari POV pengelola API, lebih mudah untuk mempertahankan berbagai versi API secara paralel dengan menggunakan sistem kontrol sumber yang sebagian besar bekerja pada file sebagai unit terkecil dari versi (kode sumber).
Namun, dengan versi API yang terlihat jelas di URI ada peringatan: orang mungkin juga menolak pendekatan ini karena riwayat API menjadi terlihat / berbeda dalam desain URI dan karena itu rentan terhadap perubahan dari waktu ke waktu yang bertentangan dengan pedoman REST. Saya setuju!
Cara untuk mengatasi keberatan yang masuk akal ini, adalah dengan mengimplementasikan versi API terbaru di bawah URI basis versi API. Dalam hal ini, pengembang klien API dapat memilih untuk:
berkembang melawan yang terbaru (berkomitmen untuk mempertahankan aplikasi yang melindunginya dari perubahan API yang mungkin merusak klien API mereka yang dirancang dengan buruk ).
ikat ke API versi tertentu (yang menjadi jelas) tetapi hanya untuk waktu yang terbatas
Misalnya, jika API v3.0 adalah versi API terbaru, dua berikut ini harus alias (yaitu berperilaku identik dengan semua permintaan API):
http: // shonzilla / api / pelanggan / 1234
http: // shonzilla / api /v3.0 / customers / 1234
http: // shonzilla / api / v3 / customers / 1234
Selain itu, klien API yang masih mencoba menunjuk ke API lama harus diberi tahu untuk menggunakan versi API terbaru sebelumnya, jika versi API yang mereka gunakan sudah usang atau tidak didukung lagi . Jadi mengakses salah satu URI usang seperti ini:
http: // shonzilla / api /v2.2 / customers / 1234
http: // shonzilla / api /v2.0 / customers / 1234
http: // shonzilla / api / v2 / customers / 1234
http: // shonzilla / api /v1.1 / customers / 1234
http: // shonzilla / api / v1 / customers / 1234
harus mengembalikan salah satu dari kode status HTTP 30x yang menunjukkan pengalihan yang digunakan bersama dengan Location
header HTTP yang mengalihkan ke versi sumber daya URI yang sesuai yang tetap seperti ini:
http: // shonzilla / api / customers / 1234
Setidaknya ada dua kode status HTTP pengalihan yang sesuai untuk skenario versi API:
301 Dipindahkan secara permanen yang menunjukkan bahwa sumber daya dengan URI yang diminta dipindahkan secara permanen ke URI lain (yang seharusnya merupakan permalink sumber daya contoh yang tidak mengandung info versi API). Kode status ini dapat digunakan untuk menunjukkan versi API yang usang / tidak didukung, memberi tahu klien API bahwa URI sumber daya berversi telah digantikan oleh permalink sumber daya .
302 Ditemukan menunjukkan bahwa sumber daya yang diminta untuk sementara berada di lokasi lain, sementara URI yang diminta mungkin masih didukung. Kode status ini mungkin berguna ketika URI versi-kurang sementara tidak tersedia dan bahwa permintaan harus diulang menggunakan alamat pengalihan (mis. Menunjuk URI dengan versi APi tertanam) dan kami ingin memberi tahu klien untuk tetap menggunakannya (yaitu permalinks).
skenario lain dapat ditemukan di bab Redirection 3xx dari spesifikasi HTTP 1.1