Zusammengesetzten Schlüssel für REST-API-Methoden
Ich bin auf der Suche nach den best practices für RESTful API-design für den folgenden Anwendungsfall:
Domain-Objekt Fahrzeug:
class Vehicle {
private String vehicleType;
private String colour;
private String transmission;
private String yearOfIssue;
}
Ein Beispiel-Objekt:
Vehicle = {vehicleType : 'Car', colour : 'Red', transmission : 'Automatic', yearOfIssue : '2008'};
In diesem Domänen-Modell gibt es keinen einzigen Feld eindeutige id (z.B. vehicleId), sondern alle Felder des Objekts bilden zusammen den Primärschlüssel (diese Einschränkung gibt es in der Datenbank-layer).
Wir haben keine Flexibilität, um eine änderung dieser domain-Modell fügen Sie ein einzelnes Feld eindeutige id.
Also meine Frage ist wie folgt - Wenn ich will hinzufügen einer einfachen REST-API auf top-dieser domain-Objekt, und bietet einfache Funktionen zum ERSTELLEN, AKTUALISIEREN, LÖSCHEN und BEKOMMEN Fahrzeuge, was die beste Praxis für die PFAD-Endpunkte für diese Methoden?
Folgenden obige Beispiel, wenn der domain-Modell ein einzelnes Feld eindeutiger Bezeichner vehicleId, dann kann ich mir vorstellen, die folgenden Endpunkte:
GET /vehicles/:vehicleId
PUT /vehicles/:vehicleId
DELETE /vehicles/:vehicleId
Ich bin mir nicht bewusst, ein Muster, das vorhanden ist, ähnlich wie dies für den composite-Schlüssel wie:
GET /vehicles/:vehicleTypecolourtransmissionyearOfIssue
GET /vehicles/CarRedAutomatic2008
scheint nicht korrekt zu sein.
Einen Rat, ein gutes Muster zu Folgen für diesen Anwendungsfall würde sehr geschätzt werden.
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach den Allgemeinen REST-standards, die jeder Endpunkt stellt eine Ressource, und der client kann auf Ihnen arbeiten mit http-Verben. In diesem Beispiel die Ressource Fahrzeug-und client abrufen der Daten vom server per GET. Idealerweise wird jede Ressource soll eindeutig identifiziert werden mit einer einzigartigen (einzigen) Schlüssel.
Aber Ihre Ressource (Fahrzeug) nicht einen einzigen Wert eindeutiger Schlüssel, und es nicht verändert werden kann in das system! In diesem Fall können Sie immer noch die GET-Aufruf mit allen Parametern, die Ressource zu identifizieren, wie jede andere standard-http-Aufrufe, wie
Technologie - /Plattform, die Sie verwenden, wenn dieser erlaubt es, individuelle Routen für Ihre Methode können Sie erstellen eine benutzerdefinierte route etwas wie
Auf und rufen Sie Ihren service als
Die gute Sache über dieses ist, Ihr uri wird kürzer. Aber auf der anderen Seite [1] Für alle Möglichkeiten/Ressourcen dieser Art haben, müssen Sie erstellen Sie benutzerdefinierte Routen, und [2] diese uri macht nicht viel Sinn, es sei denn, Sie verfügen über Kenntnisse der spezifischen Verfahren und route.
POST /vehicles/Car/Red/Automatic/2008
In ASP.NET Core, ich in der Regel stellen einen zusammengesetzten Schlüssel, wie diese:
POST /vehicles/(car:red:automatic:2008)
oder
POST /vehicles/(car|red|automatic|2008)
Rahmen hat kein problem, die Zuordnung dieser zu action Parameter in der angegebenen Reihenfolge.
Beispiel Anfrage:
PUT /vehicles/(Ford:Ranger:100% genuine:2000)
ASP.NET Core
(wie angegeben) und das framework ermöglicht es, Sonderzeichen in Ordnung. Siehe screenshot Hinzugefügt, um die Antwort.Werden, Erholsam, würden Sie brauchen, zu einem einzigen, eindeutigen Kennung und ergänzen Sie Ihre Klasse.
Dann könnten Sie den Zugriff auf HTTP:Get http://mysite/vehicles/3842. Allerdings, Sie möglicherweise nicht haben Zugriff auf die interne, eindeutige Kennung, vor allem, wenn Sie Saatgut oder aktualisieren der Datenbank. Ich habe über ähnliche Probleme und verwenden die ÜBRIGEN Verben ist, werde ich einen externen Bezeichner, um es einfacher für Mensch und externen Systemen den Zugriff auf die Datensätze:
Dann das verb aussieht:
HTTP:Get http://mysite/vehicles/externalId/sedanbluemanual2015. Sie müssen nicht zum Parsen der URI als alle Daten werden im body der Nachricht, die Sie gerade brauchen, um sicherzustellen, dass der string eindeutig identifiziert das Fahrzeug.