Diese Frage bezieht sich auf das optimale REST-API-Design und auf ein Problem, bei dem ich zwischen verschachtelten Ressourcen und Sammlungen auf Stammebene wählen muss.REST-API-Entwurf: Nested Collection vs. New Root
Um das Konzept zu demonstrieren, nehme ich an, dass ich die Kollektionen City
, Business
und Employees
habe. Eine typische API kann wie folgt aufgebaut sein. Stellen Sie sich vor, dass ABC, X7N und WWW Schlüssel sind, z. guids:
GET Api/City/ABC/Businesses (returns all Businesses in City ABC)
GET Api/City/ABC/Businesses/X7N (returns business X7N)
GET Api/City/ABC/Businesses/X7N/Employees (returns all employees at business X7N)
PUT Api/City/ABC/Businesses/X7N/Employees/WWW (updates employee WWW)
Dies scheint sauber, weil es die ursprüngliche Domänenstruktur folgt - Geschäft in einer Stadt ist, und die Mitarbeiter in einem Unternehmen sind. Einzelne Artikel sind über den Schlüssel unter der Sammlung zugänglich (z. B. ../Businesses
gibt alle Geschäfte zurück, während ../Businesses/X7N
das individuelle Geschäft zurückgibt). Hier
ist, was die API Verbraucher zu tun in der Lage sein muss:
- Erhalten Unternehmen in einer Stadt
(GET Api/City/ABC/Businesses)
- Holen Sie sich alle Mitarbeiter an einem Business-
(GET Api/City/ABC/Businesses/X7N/Employees)
- aktualisieren einzelnen Mitarbeiterinformationen
(PUT Api/City/ABC/Businesses/X7N/Employees/WWW)
Dieser zweite und dritte Aufruf, obwohl er an der richtigen Stelle zu sein scheint, verwendet viele Parameter, die eigentlich nicht benötigt werden erforderlich.
- Um Mitarbeiter zu einem Geschäft zu kommen, benötigt der einzige Parameter ist der Schlüssel des Unternehmens (
X7N
). - einen einzelnen Mitarbeiter zu aktualisieren, benötigt der einzige Parameter, es ist der Schlüssel des Mitarbeiters (
WWW
)
Nichts im Backend-Code erfordert nicht die wichtigsten Informationen, das Geschäft zu suchen oder die Mitarbeiter zu aktualisieren. Anstatt also, erscheinen die folgenden Endpunkte besser:
GET Api/City/ABC/Businesses (returns all Businesses in City ABC)
GET Api/Businesses/X7N (returns business X7N)
GET Api/Businesses/X7N/Employees (returns all employees at business X7N)
PUT Api/Employees/WWW (updates employee WWW)
Wie Sie sehen können, habe ich erstellt eine neue Wurzel für Unternehmen und Mitarbeiter, wenn auch aus einer Domäne Perspektive sie sind eine Unter/Sub-Sub -Sammlung.
Keine der beiden Lösungen scheint mir sehr sauber zu sein.
- Das erste Beispiel bittet um unnötige Information, sondern ist in einer Weise strukturiert, die „natürlich“ für den Verbraucher
- Das zweite Beispiel nur für notwendige fragt (einzelne Elemente aus einer Sammlung über unteren Blätter abgerufen) erscheint Informationen, aber ist nicht in einer "natürlichen" Art und Weise strukturiert - Subsammlungen sind über Wurzeln zugänglich
- Der einzelne Mitarbeiter root würde nicht funktionieren, wenn ein neuer Mitarbeiter hinzufügen, wie wir wissen müssen, welches Geschäft den Mitarbeiter hinzufügen, was bedeutet dieser Aufruf müsste zumindest unter dem Business-Stamm liegen, wie
POST Api/Businesses/X7N7/Employees
, was alles noch verwirrender macht.
Gibt es eine sauberere, dritte Möglichkeit, an die ich nicht denke?