Ketika mendesain Layanan Web RESTful haruskah API dirancang untuk bekerja ID untuk Strings untuk nilai-nilai yang diteruskan bolak-balik antara server?
Berikut ini sebuah contoh: Katakanlah saya memiliki sumber daya Karyawan, yang memiliki status dan atribut gender. Dalam Status database dan Jenis Kelamin serta tabel terpisah dan dengan demikian memisahkan objek Domain, masing-masing dengan pengidentifikasi sendiri.
Katakanlah permintaan klien / karyawan / 1. Ada server mungkin mengembalikan sesuatu seperti ini ....
Kasus 1:
{
"id": 1,
"firstName": "Jane",
"lastName": "Doe",
"active": true,
"gender": {
"id": 1,
"gender": "FEMALE"
},
"status": {
"id": 3,
"status": "FULL_TIME"
}
}
Kasus 2:
{
"id": 1,
"firstName": "Jane",
"lastName": "Doe",
"active": true,
"gender": "FEMALE",
"status": "FULL_TIME"
}
Kasus 3:
{
"id": 1,
"firstName": "Jane",
"lastName": "Doe",
"active": true,
"genderId": 1,
"statusId": 3
}
Kasus 3 tampaknya masuk akal karena klien tidak tahu apa itu genderId 1 kecuali jika berbalik dan membuat panggilan lain ke server untuk mendapatkan data itu.
Namun sekarang, katakanlah klien memperbarui pengguna melalui:
PUT /employee/1
Haruskah Payload permintaan menggunakan id atau string? Either way, back-end harus mencari mereka untuk memastikan mereka valid, tetapi lebih baik untuk bekerja dengan ID lebih dari Strings.
sumber
Kasus 2 adalah satu-satunya pilihan nyata. Anda sudah menunjukkan masalah dengan Kasus 3. Kasus 1 memberikan informasi yang tidak dipedulikan klien API (ID internal untuk status, misalnya), dan mengharuskan klien untuk mengetahui tentang hal-hal tersebut untuk membangun permintaan PUT . Ya, permintaan PUT sedikit lebih singkat jika dapat menggunakan ID alih-alih string penuh, tetapi menetapkan "FULL_TIME" atau "PART_TIME" adalah apa yang diketahui klien, bukan bahwa mereka kebetulan memiliki beberapa ID sewenang-wenang dalam database Anda .
Tentu saja, Anda dapat mendokumentasikan ID dalam dokumentasi API Anda, tetapi akan lebih mudah untuk mendokumentasikan nilai valid string yang diizinkan, dan mungkin lebih jelas.
sumber
Data yang dihitung seperti yang Anda dapat di sini sangat dapat disimpan dalam cache. Gunakan tautan sebagai ganti objek. Gunakan header caching untuk memungkinkan klien untuk men-cache gender dan status secara lokal, katakan selama 24 jam. Maka hanya panggilan pertama hari itu yang meninggalkan mesin klien. Anda mungkin juga dapat mengkonfigurasi caching untuk memungkinkan server perantara menyimpan informasi, sehingga beberapa permintaan klien bahkan tidak membuatnya ke server Anda.
Satu kelemahannya adalah itu
/genders/1
tidak bisa dibaca manusia. Anda bisa menggunakan/genders/female
, tetapi Anda tidak akan pernah bisa mengubah nama jenis kelamin tanpa melanggar klien. Itulah kunci sintetis vs. pengorbanan kunci alami - fleksibilitas vs keterbacaan terhadap manusia.Anda mungkin juga ingin mempertimbangkan untuk meletakkan semua daftar nilai Anda di bawah satu titik akhir yang sama, seperti
Ini akan menjelaskan kepada klien bahwa mereka pada dasarnya adalah pasangan kunci-nilai yang dimiliki oleh kelompok yang berbeda.
sumber
Saya akan mencari sesuatu di antara 1 dan 2, karena alasan yang disebutkan David:
Anda tidak ingin membuka ID hal-hal kecuali diperlukan.
Namun, mengekspos ID mungkin menjadi perlu di beberapa titik waktu. Jika itu terjadi, kompatibilitas ke belakang menjadi perhatian. Jadi, saya akan melakukan ini:
Itu memiliki properti yang sama seperti opsi 2 miliki; tetapi memiliki manfaat bahwa menambahkan ID nanti tidak memperkenalkan jeda BC:
Seperti yang Eric tunjukkan dalam komentar, ini masih menggunakan nama entitas sebagai pengidentifikasi unik. Jika ID diperkenalkan kemudian, nama harus tetap sama karena klien yang lebih tua dapat (atau lebih tepatnya ) akan mengkodekannya.
sumber
name
untuk query dan memperbarui.id
sebagai pengidentifikasi unik, maka itu adalah perubahan yang melanggar.