Sollte die API beim Entwerfen eines RESTful-Webdiensts so ausgelegt sein, dass sie die ID für Zeichenfolgen für Werte verwendet, die zwischen dem Server hin und her übertragen werden?
Hier ein Beispiel: Angenommen, ich habe eine Mitarbeiterressource mit Status- und Geschlechtsattributen. In der Datenbank Status und Geschlecht und separate Tabellen und damit separates Domain-Objekt, jedes mit seiner eigenen Kennung.
Angenommen, die Kundenanfrage / Mitarbeiter / 1. Dort könnte der Server so etwas zurückgeben ....
Fall 1:
{
"id": 1,
"firstName": "Jane",
"lastName": "Doe",
"active": true,
"gender": {
"id": 1,
"gender": "FEMALE"
},
"status": {
"id": 3,
"status": "FULL_TIME"
}
}
Fall 2:
{
"id": 1,
"firstName": "Jane",
"lastName": "Doe",
"active": true,
"gender": "FEMALE",
"status": "FULL_TIME"
}
Fall 3:
{
"id": 1,
"firstName": "Jane",
"lastName": "Doe",
"active": true,
"genderId": 1,
"statusId": 3
}
Fall 3 scheint am wenigsten sinnvoll zu sein, da der Client keine Ahnung hat, was genderId 1 ist, es sei denn, er dreht sich um und ruft den Server erneut an, um diese Daten abzurufen.
Angenommen, der Client aktualisiert den Benutzer durch:
PUT /employee/1
Sollte die Anforderungsnutzlast die IDs oder eine Zeichenfolge verwenden? In jedem Fall muss das Back-End sie nachschlagen, um sicherzustellen, dass sie gültig sind. Es ist jedoch besser, mit IDs über Strings zu arbeiten.
quelle
Fall 2 ist die einzige echte Option. Sie haben bereits auf die Probleme mit Fall 3 hingewiesen. Fall 1 enthält Informationen, die dem Client der API nicht wichtig sind (z. B. die internen IDs für Status), und erfordert, dass der Client die IDs zum Erstellen einer PUT-Anforderung kennt . Ja, die PUT-Anforderung ist etwas knapper, wenn sie die IDs anstelle der vollständigen Zeichenfolgen verwenden kann. Der Client weiß jedoch, dass er "FULL_TIME" oder "PART_TIME" angibt, und nicht, dass er zufällig beliebige IDs in Ihrer Datenbank hat .
Natürlich können Sie die IDs in Ihrer API-Dokumentation dokumentieren, aber es ist genauso einfach, die gültigen Werte zu dokumentieren, die die Zeichenfolgen zulassen dürfen, und wahrscheinlich klarer.
quelle
Aufgezählte Daten, wie Sie sie hier haben, können in hohem Maße zwischengespeichert werden. Verwenden Sie Links anstelle von Objekten. Verwenden Sie Caching-Header, damit Clients Geschlechter und Status lokal zwischenspeichern können, beispielsweise 24 Stunden lang. Dann verlässt nur der erste Anruf des Tages den Client-Computer. Sie können das Caching wahrscheinlich auch so konfigurieren, dass Zwischenserver die Informationen speichern können, sodass einige Clientanforderungen nicht einmal auf Ihren Server gelangen.
Ein Nachteil ist, dass dies
/genders/1
nicht für Menschen lesbar ist. Sie können stattdessen verwenden/genders/female
, aber dann können Sie den Namen eines Geschlechts nie ändern, ohne Kunden zu brechen. Das ist der Kompromiss zwischen synthetischem Schlüssel und natürlichem Schlüssel - Flexibilität und Lesbarkeit.Möglicherweise möchten Sie auch alle Ihre Wertelisten unter einem gemeinsamen Endpunkt platzieren, z
Dadurch wird den Kunden klargestellt, dass es sich bei allen um Schlüssel-Wert-Paare handelt, die zu verschiedenen Gruppierungen gehören.
quelle
Ich würde mich für etwas zwischen 1 und 2 entscheiden, aus den Gründen, die David erwähnte:
Sie möchten die ID von Dingen nur dann offenlegen, wenn dies erforderlich ist.
Das Offenlegen der ID kann jedoch zu einem bestimmten Zeitpunkt erforderlich werden. In diesem Fall ist die Abwärtskompatibilität ein Problem. Also würde ich das tun:
Das hat die gleichen Eigenschaften wie Option 2; Es hat jedoch den Vorteil, dass das spätere Hinzufügen der ID keine BC-Unterbrechung verursacht:
Wie Eric in den Kommentaren betont, wird der Entitätsname weiterhin als eindeutiger Bezeichner verwendet. Wenn die ID später eingeführt wird, muss der Name immer noch derselbe bleiben, da ältere Clients darauf codiert haben könnten (oder eher werden ).
quelle
name
zum Abfragen und Aktualisieren verwenden.id
als eindeutige Kennung verwenden müssen, ist dies eine wichtige Änderung.