Was sind Best Practices für verschachtelte REST-Ressourcen?

301

Soweit ich das beurteilen kann, sollte jede einzelne Ressource nur einen kanonischen Pfad haben. Was wären im folgenden Beispiel gute URL-Muster?

Nehmen Sie als Beispiel eine Restrepräsentation von Unternehmen. In diesem hypothetischen Beispiel kann jedes Unternehmen besitzt 0 oder mehr Abteilungen und jede Abteilung besitzt 0 oder mehr Beschäftigten.

Eine Abteilung kann ohne ein verbundenes Unternehmen nicht existieren .

Ein Mitarbeiter kann ohne eine zugehörige Abteilung nicht existieren .

Jetzt würde ich die natürliche Darstellung der Ressourcenmuster finden.

  • /companies Eine Sammlung von Unternehmen - Akzeptiert Put für ein neues Unternehmen. Holen Sie sich für die gesamte Sammlung.
  • /companies/{companyId}Ein individuelles Unternehmen. Akzeptiert GET, PUT und DELETE
  • /companies/{companyId}/departmentsAkzeptiert POST für einen neuen Artikel. (Erstellt eine Abteilung innerhalb des Unternehmens.)
  • /companies/{companyId}/departments/{departmentId}/
  • /companies/{companyId}/departments/{departmentId}/employees
  • /companies/{companyId}/departments/{departmentId}/employees/{empId}

Angesichts der Einschränkungen in jedem der Abschnitte halte ich dies für sinnvoll, wenn es etwas tief verschachtelt ist.

Meine Schwierigkeit tritt jedoch auf, wenn ich GETalle Mitarbeiter in allen Unternehmen auflisten möchte .

Das Ressourcenmuster dafür würde am ehesten /employees(Die Sammlung aller Mitarbeiter) zugeordnet.

Bedeutet das, dass ich es /employees/{empId}auch haben sollte, denn wenn ja, dann gibt es zwei URIs, um dieselbe Ressource zu erhalten?

Oder vielleicht sollte das gesamte Schema abgeflacht werden, aber das würde bedeuten, dass Mitarbeiter ein verschachteltes Objekt der obersten Ebene sind.

Auf einer grundlegenden Ebene wird /employees/?company={companyId}&department={deptId}genau die gleiche Ansicht der Mitarbeiter zurückgegeben wie das am tiefsten verschachtelte Muster.

Was ist die beste Praxis für die URL - Muster , bei denen Ressourcen im Besitz von anderen Ressourcen , sondern separat Abfrage-fähig sein?

Wir s
quelle
1
Dies ist fast genau das oppsite Problem , dass in beschrieben stackoverflow.com/questions/7104578/... obwohl die Antworten in Beziehung gesetzt werden können. Beide Fragen beziehen sich auf das Eigentum, aber dieses Beispiel impliziert, dass das Objekt der obersten Ebene nicht das besitzende ist.
Wes
1
Genau das, worüber ich mich gewundert habe. Für den gegebenen Anwendungsfall scheint Ihre Lösung in Ordnung zu sein, aber was ist, wenn die Beziehung eher eine Aggregation als eine Komposition ist? Sie haben immer noch Schwierigkeiten herauszufinden, was hier die beste Vorgehensweise ist ... Bedeutet diese Lösung auch nur die Erstellung der Beziehung, z. B. wenn eine vorhandene Person beschäftigt ist, oder erstellt sie ein Personenobjekt?
Jakob O.
Es schafft eine Person in meinem fiktiven Beispiel. Der Grund, warum ich diese Domain-Begriffe verwendet habe, ist ein einigermaßen verständliches Beispiel, obwohl es mein eigentliches Problem nachahmt. Haben Sie die verknüpfte Frage durchgesehen, die Sie für eine Aggragationsbeziehung mehr stören könnte?
Wes
Ich habe meine Frage in eine Antwort und eine Frage aufgeteilt.
Wes

Antworten:

152

Was Sie getan haben, ist richtig. Im Allgemeinen kann es mehrere URIs für dieselbe Ressource geben - es gibt keine Regeln, die besagen, dass Sie dies nicht tun sollten.

Und im Allgemeinen müssen Sie möglicherweise direkt oder als Teilmenge von etwas anderem auf Elemente zugreifen - daher ist Ihre Struktur für mich sinnvoll.

Nur weil Mitarbeiter unter Abteilung erreichbar sind:

company/{companyid}/department/{departmentid}/employees

Das bedeutet nicht, dass sie auch unter Unternehmen nicht zugänglich sind:

company/{companyid}/employees

Welches würde Mitarbeiter für dieses Unternehmen zurückgeben. Es hängt davon ab, was Ihr konsumierender Kunde benötigt - dafür sollten Sie entwerfen.

Ich würde jedoch hoffen, dass alle URL-Handler denselben Hintergrundcode verwenden, um die Anforderungen zu erfüllen, damit Sie keinen Code duplizieren.

jeremyh
quelle
11
Dies zeigt den Geist von RESTful. Es gibt keine Regeln, die besagen, dass Sie dies tun sollten oder nicht, wenn Sie nur zuerst eine sinnvolle Ressource in Betracht ziehen . Darüber hinaus frage ich mich, was die beste Vorgehensweise ist, um Code in solchen Szenarien nicht zu duplizieren .
Abookyun
13
@abookyun Wenn Sie beide Routen benötigen, kann wiederholter Controller-Code zwischen ihnen zu Serviceobjekten abstrahiert werden.
BG-Code
Dies hat nichts mit REST zu tun. REST kümmert sich nicht darum, wie Sie den
Pfadteil
Bei dieser Antwort denke ich, dass jede API, bei der die dynamischen Segmente alle eindeutige Bezeichner sind, nicht mehrere dynamische Segmente verarbeiten muss ( /company/3/department/2/employees/1). Wenn die API Möglichkeiten zum Abrufen jeder Ressource bietet, kann jede dieser Anforderungen entweder in einer clientseitigen Bibliothek oder als einmaliger Endpunkt erfolgen, der Code wiederverwendet.
Max
1
Obwohl es kein Verbot gibt, halte ich es für eleganter, nur einen Weg zu einer Ressource zu haben - hält alle mentalen Modelle einfacher. Ich bevorzuge auch, dass URIs ihren Ressourcentyp nicht ändern, wenn es eine Verschachtelung gibt. Beispielsweise /company/*sollte nur die Unternehmensressource zurückgegeben und der Ressourcentyp überhaupt nicht geändert werden. Nichts davon wird von REST spezifiziert - es ist im Allgemeinen eine schlecht spezifizierte - nur persönliche Präferenz.
Kashif
174

Ich habe beide Entwurfsstrategien ausprobiert - verschachtelte und nicht verschachtelte Endpunkte. Ich habe das gefunden:

  1. Wenn die verschachtelte Ressource einen Primärschlüssel hat und Sie keinen übergeordneten Primärschlüssel haben, müssen Sie ihn für die verschachtelte Struktur abrufen, obwohl das System ihn tatsächlich nicht benötigt.

  2. Verschachtelte Endpunkte erfordern normalerweise redundante Endpunkte. Mit anderen Worten, Sie benötigen häufig den zusätzlichen Endpunkt / Mitarbeiter, damit Sie eine abteilungsübergreifende Liste der Mitarbeiter erhalten. Wenn Sie / Mitarbeiter haben, was genau kaufen Sie / Unternehmen / Abteilungen / Mitarbeiter?

  3. Verschachtelungsendpunkte entwickeln sich nicht so gut. Beispielsweise müssen Sie jetzt möglicherweise nicht nach Mitarbeitern suchen, aber möglicherweise später. Wenn Sie eine verschachtelte Struktur haben, haben Sie keine andere Wahl, als einen weiteren Endpunkt hinzuzufügen. Bei einem nicht verschachtelten Design fügen Sie einfach weitere Parameter hinzu, was einfacher ist.

  4. Manchmal kann eine Ressource mehrere Arten von Eltern haben. Dies führt zu mehreren Endpunkten, die alle dieselbe Ressource zurückgeben.

  5. Redundante Endpunkte erschweren das Schreiben der Dokumente und das Erlernen der API.

Kurz gesagt, das nicht verschachtelte Design scheint ein flexibleres und einfacheres Endpunktschema zu ermöglichen.

Patc
quelle
24
War sehr erfrischend, auf diese Antwort zu stoßen. Ich verwende seit einigen Monaten verschachtelte Endpunkte, nachdem mir beigebracht wurde, dass dies der "richtige Weg" ist. Ich bin zu all den Schlussfolgerungen gekommen, die Sie oben aufgeführt haben. So viel einfacher mit einem nicht verschachtelten Design.
user3344977
6
Sie scheinen einige der Nachteile als Vorteile aufzulisten. "Einfach mehr Parameter in einen einzigen Endpunkt packen" erschwert das Dokumentieren und Lernen der API und nicht umgekehrt. ;-)
Drenmi
4
Kein Fan dieser Antwort. Es ist nicht erforderlich, redundante Endpunkte einzuführen, nur weil Sie eine verschachtelte Ressource hinzugefügt haben. Es ist auch kein Problem, dass dieselbe Ressource von mehreren Eltern zurückgegeben wird, vorausgesetzt, diese Eltern besitzen die verschachtelte Ressource wirklich. Es ist kein Problem, eine übergeordnete Ressource zu erhalten, um zu lernen, wie man mit den verschachtelten Ressourcen interagiert. Eine gute erkennbare REST-API sollte dies tun.
Scottm
3
@Scottm - Ein Nachteil verschachtelter Ressourcen, auf den ich gestoßen bin, ist, dass es dazu führen kann, dass falsche Daten zurückgegeben werden, wenn die IDs der übergeordneten Ressourcen falsch sind / nicht übereinstimmen. Unter der Annahme, dass keine Autorisierungsprobleme vorliegen, muss die API-Implementierung überprüfen, ob die verschachtelte Ressource tatsächlich ein untergeordnetes Element der übergeordneten Ressource ist, die übergeben wird. Wenn diese Prüfung nicht codiert ist, kann die API-Antwort falsch sein und zu Beschädigungen führen. Was sind deine Gedanken?
Andy Dufresne
1
Sie benötigen die übergeordneten Zwischen-IDs nicht, wenn die Endressourcen alle eindeutige IDs haben. Um beispielsweise den Mitarbeiter anhand seiner ID zu ermitteln, haben Sie GET / Unternehmen / Abteilungen / Mitarbeiter / {empId} oder um alle Mitarbeiter in Unternehmen 123 zu ermitteln, haben Sie GET / Unternehmen / 123 / Abteilungen / Mitarbeiter / Wenn Sie den Pfad hierarchisch halten, wird deutlicher, wie Sie können zu den Zwischenressourcen gelangen, um zu filtern / erstellen / ändern, und helfen meiner Meinung nach bei der Auffindbarkeit.
PaulG
77

Ich habe das, was ich getan habe, von der Frage zu einer Antwort verschoben, bei der wahrscheinlich mehr Menschen es sehen werden.

Was ich getan habe, ist, die Erstellungsendpunkte am verschachtelten Endpunkt zu haben. Der kanonische Endpunkt zum Ändern oder Abfragen eines Elements befindet sich nicht in der verschachtelten Ressource .

In diesem Beispiel (nur die Endpunkte auflisten, die eine Ressource ändern)

  • POST /companies/ Wenn Sie eine neue Firma erstellen, wird ein Link zur erstellten Firma zurückgegeben.
  • POST /companies/{companyId}/departments Wenn eine Abteilung erstellt wird, gibt die neue Abteilung einen Link zu zurück /departments/{departmentId}
  • PUT /departments/{departmentId} ändert eine Abteilung
  • POST /departments/{deparmentId}/employees Erstellt einen neuen Mitarbeiter, der einen Link zurückgibt /employees/{employeeId}

Es gibt also Ressourcen auf Stammebene für jede der Sammlungen. Das Erstellen befindet sich jedoch im Besitzobjekt .

Wir s
quelle
4
Ich habe mir auch die gleiche Art von Design ausgedacht. Ich denke, es ist intuitiv, solche Dinge "dort zu erstellen, wo sie hingehören", aber sie trotzdem global aufzulisten. Dies gilt umso mehr, wenn es eine Beziehung gibt, in der eine Ressource ein übergeordnetes Element haben muss. Wenn Sie diese Ressource dann global erstellen, ist dies nicht offensichtlich, aber es ist absolut sinnvoll, sie in einer Unterressource wie dieser auszuführen.
Joakim
Ich denke du hast POSTBedeutung benutzt PUTund sonst.
Gerardo Lima
Eigentlich nein Beachten Sie, dass ich keine vorab zugewiesenen IDs für die Erstellung verwende, da der Server in diesem Fall für die Rückgabe der ID (im Link) verantwortlich ist. Daher ist das Schreiben von POST korrekt (es kann nicht auf dieselbe Implementierung zugegriffen werden). Der Put ändert jedoch die gesamte Ressource, ist aber immer noch am selben Ort verfügbar, sodass ich sie einsetze. PUT vs POST ist eine andere Sache und auch umstritten. Zum Beispiel stackoverflow.com/questions/630453/put-vs-post-in-rest
Wes
@Wes Auch ich bevorzuge es, Verbmethoden so zu ändern, dass sie unter dem übergeordneten Element liegen. Aber sehen Sie, dass das Übergeben von Abfrageparametern für globale Ressourcen gut akzeptiert wird? Beispiel: POST / Abteilungen mit Abfrageparameter Firma = Firmen-ID
Ayyappa
1
@ Mohamad Wenn Sie der Meinung sind, dass der andere Weg sowohl beim Verstehen als auch beim Anwenden von Einschränkungen einfacher ist, können Sie gerne eine Antwort geben. In diesem Fall geht es darum, das Mapping explizit zu machen. Es könnte mit einem Parameter funktionieren, aber genau das ist die Frage. Was ist der beste Weg.
Wes
35

Ich habe alle oben genannten Antworten gelesen, aber es scheint, dass sie keine gemeinsame Strategie haben. Ich habe in Microsoft Documents einen guten Artikel über Best Practices in der Design-API gefunden . Ich denke, Sie sollten sich beziehen.

In komplexeren Systemen kann es verlockend sein, URIs bereitzustellen, mit denen ein Client durch mehrere Beziehungsebenen navigieren kann, z. B. /customers/1/orders/99/products.Diese Komplexitätsebene kann jedoch schwierig aufrechtzuerhalten sein und ist unflexibel, wenn sich die Beziehungen zwischen Ressourcen in Zukunft ändern. Versuchen Sie stattdessen, URIs relativ einfach zu halten . Sobald eine Anwendung einen Verweis auf eine Ressource hat, sollte es möglich sein, diesen Verweis zu verwenden, um Elemente zu finden, die sich auf diese Ressource beziehen. Die vorhergehende Abfrage kann durch die URI ersetzt werden /customers/1/orders, um alle Bestellungen für Kunde 1 /orders/99/productszu finden und dann die Produkte in dieser Bestellung zu finden.

.

Trinkgeld

Vermeiden Sie Ressourcen-URIs, die komplexer sind als collection/item/collection.

Langer Nguyen
quelle
3
Die Referenz, die Sie geben, ist erstaunlich, zusammen mit dem Punkt, an dem Sie sich davon abheben, keine komplexen URIs zu erstellen.
Vicco
Wenn ich also ein Team für einen Benutzer erstellen möchte, sollte es POST / Teams (Benutzer-ID im Körper) oder POST / Benutzer /: ID / Teams sein
Coinhndp
@coinhndp Hallo, Sie sollten POST / Teams verwenden und können die Benutzer-ID erhalten, nachdem Sie das Zugriffstoken autorisiert haben. Ich meine, wenn Sie etwas erstellen, benötigen Sie einen Autorisierungscode, oder? Ich weiß nicht, welches Framework Sie verwenden, aber ich bin sicher, dass Sie die Benutzer-ID im API-Controller erhalten könnten. Beispiel: Rufen Sie in der ASP.NET-API RequestContext.Principal aus einer Methode in ApiController heraus auf. In Spring Secirity hilft Ihnen SecurityContextHolder.getContext (). GetAuthentication (). GetPrincipal (). In AWS NodeJS Lambda ist dies cognito: Benutzername im Header-Objekt.
Long Nguyen
Also, was ist los mit dem POST / users /: id / Teams. Ich denke, es wird in dem Microsoft-Dokument empfohlen, das Sie oben gepostet haben
coinhndp
@coinhndp Wenn Sie ein Team als Administrator erstellen, ist das gut. Aber als normale Benutzer weiß ich nicht, warum Sie userId im Pfad benötigen? Ich nehme an, wir haben Benutzer_A und Benutzer_B. Was denken Sie, wenn Benutzer_A ein neues Team für Benutzer_B erstellen könnte, wenn Benutzer_A POST / Benutzer / Benutzer_B / Teams aufruft. In diesem Fall muss die Benutzer-ID nicht übergeben werden. Die Benutzer-ID kann nach der Autorisierung abgerufen werden. Teams /: id / projects sind jedoch gut, um beispielsweise eine Beziehung zwischen Team und Projekt herzustellen.
Long Nguyen
10

Wie Ihre URLs aussehen, hat nichts mit REST zu tun. Alles geht. Es ist eigentlich ein "Implementierungsdetail". So wie Sie Ihre Variablen benennen. Alles was sie sein müssen ist einzigartig und langlebig.

Verschwenden Sie nicht zu viel Zeit damit, treffen Sie einfach eine Wahl und bleiben Sie dabei / seien Sie konsequent. Wenn Sie beispielsweise mit Hierarchien arbeiten, tun Sie dies für alle Ihre Ressourcen. Wenn Sie mit Abfrageparametern ... usw. arbeiten, genau wie Namenskonventionen in Ihrem Code.

Warum so? Soweit ich weiß, soll eine "RESTful" -API durchsuchbar sein (Sie wissen ... "Hypermedia als Engine des Anwendungsstatus"), daher kümmert sich ein API-Client nicht darum, wie Ihre URLs aussehen, solange sie sind gültig (es gibt keine Suchmaschinenoptimierung, keinen Menschen, der diese "freundlichen URLs" lesen muss, außer möglicherweise zum Debuggen ...)

Wie schön / verständlich eine URL in einer REST-API ist, ist nur für Sie als API-Entwickler interessant, nicht für den API-Client, wie es der Name einer Variablen in Ihrem Code wäre.

Das Wichtigste ist, dass Ihr API-Client weiß, wie Sie Ihren Medientyp interpretieren. Zum Beispiel weiß es, dass:

  • Ihr Medientyp verfügt über eine Links-Eigenschaft, in der verfügbare / verwandte Links aufgelistet sind.
  • Jeder Link wird durch eine Beziehung identifiziert (genau wie Browser wissen, dass Link [rel = "Stylesheet"] bedeutet, dass es sich um ein Stylesheet handelt oder rel = Favico ein Link zu einem Favicon ist ...)
  • und es ist bekannt, was diese Beziehungen bedeuten ("Unternehmen" bedeuten eine Liste von Unternehmen, "Suche" bedeutet eine URL mit Vorlagen für die Suche in einer Liste von Ressourcen, "Abteilungen" bedeutet Abteilungen der aktuellen Ressource)

Unten finden Sie ein Beispiel für einen HTTP-Austausch (Körper befinden sich in Yaml, da das Schreiben einfacher ist):

Anfrage

GET / HTTP/1.1
Host: api.acme.io
Accept: text/yaml, text/acme-mediatype+yaml

Antwort: Eine Liste mit Links zur Hauptressource (Unternehmen, Personen, was auch immer ...)

HTTP/1.1 200 OK
Date: Tue, 05 Apr 2016 15:04:00 GMT
Last-Modified: Tue, 05 Apr 2016 00:00:00 GMT
Content-Type: text/acme-mediatype+yaml

# body: this is your API's entrypoint (like a homepage)  
links:
  # could be some random path https://api.acme.local/modskmklmkdsml
  # the only thing the API client cares about is the key (or rel) "companies"
  companies: https://api.acme.local/companies
  people: https://api.acme.local/people

Anfrage: Link zu Unternehmen (unter Verwendung der body.links.companies der vorherigen Antwort)

GET /companies HTTP/1.1
Host: api.acme.local
Accept: text/yaml, text/acme-mediatype+yaml

Antwort: Eine unvollständige Liste von Unternehmen (unter Elementen). Die Ressource enthält verwandte Links, z. B. einen Link, mit dem die nächsten Unternehmen (body.links.next) einen anderen (mit Vorlagen versehenen) Link zur Suche erhalten (body.links.search).

HTTP/1.1 200 OK
Date: Tue, 05 Apr 2016 15:06:00 GMT
Last-Modified: Tue, 05 Apr 2016 00:00:00 GMT
Content-Type: text/acme-mediatype+yaml

# body: representation of a list of companies
links:
  # link to the next page
  next: https://api.acme.local/companies?page=2
  # templated link for search
  search: https://api.acme.local/companies?query={query} 
# you could provide available actions related to this resource
actions:
  add:
    href: https://api.acme.local/companies
    method: POST
items:
  - name: company1
    links:
      self: https://api.acme.local/companies/8er13eo
      # and here is the link to departments
      # again the client only cares about the key department
      department: https://api.acme.local/companies/8er13eo/departments
  - name: company2
    links:
      self: https://api.acme.local/companies/9r13d4l
      # or could be in some other location ! 
      department: https://api2.acme.local/departments?company=8er13eo

Wie Sie sehen, hat die Art und Weise, wie Sie den Pfadteil Ihrer URLs strukturieren, für Ihren API-Client keinen Wert. Und wenn Sie Ihrem Kunden die Struktur Ihrer URLs als Dokumentation mitteilen, führen Sie kein REST durch (oder zumindest nicht Level 3 gemäß " Richardson's Reifegradmodell ").

redben
quelle
7
"Wie schön / verständlich eine URL in einer REST-API ist, ist nur für Sie als API-Entwickler interessant, nicht für den API-Client, wie es der Name einer Variablen in Ihrem Code wäre." Warum sollte das NICHT interessant sein? Dies ist sehr wichtig, wenn nur Sie selbst die API verwenden. Dies ist Teil der Benutzererfahrung, daher würde ich sagen, dass es sehr wichtig ist, dass dies für die API-Client-Entwickler leicht zu verstehen ist. Es ist natürlich ein Bonus, die Dinge noch einfacher zu verstehen, indem Ressourcen klar verknüpft werden (Stufe 3 in der von Ihnen angegebenen URL). Alles sollte intuitiv und logisch mit klaren Beziehungen sein.
Joakim
1
@Joakim Wenn Sie eine Rest-API der Stufe 3 (Hypertext als Engine des Anwendungsstatus) erstellen, ist die Pfadstruktur der URL für den Client absolut nicht von Interesse (solange sie gültig ist). Wenn Sie nicht auf Stufe 3 zielen, dann ist dies wichtig und sollte erraten werden. Aber echtes REST ist Level 3. Ein guter Artikel: martinfowler.com/articles/richardsonMaturityModel.html
redben
4
Ich lehne es ab, jemals eine API oder Benutzeroberfläche zu erstellen, die für Menschen nicht benutzerfreundlich ist. Level 3 oder nicht, ich stimme zu, dass das Verknüpfen von Ressourcen eine großartige Idee ist. Der Vorschlag, "das URL-Schema ändern zu können", bedeutet jedoch, nicht mit der Realität und der Verwendung von APIs in Kontakt zu sein. Es ist also eine schlechte Empfehlung. Aber sicher wäre in der besten aller Welten jeder auf Level 3 REST. Ich verwende Hyperlinks UND verwende ein für Menschen verständliches URL-Schema. Level 3 schließt Ersteres nicht aus, und man sollte sich meiner Meinung nach darum kümmern. Guter Artikel aber :)
Joakim
Man sollte sich natürlich um die Wartbarkeit und andere Bedenken kümmern. Ich denke, Sie verpassen den Punkt meiner Antwort: Die Art und Weise, wie die URL aussieht, verdient nicht viel Nachdenken und Sie sollten "einfach eine Wahl treffen und dabei bleiben / sein konsequent "wie ich in der Antwort sagte. Und im Fall einer REST-API, zumindest meiner Meinung nach, ist Benutzerfreundlichkeit nicht in der URL, sondern meistens in (dem Medientyp). Wie auch immer, ich hoffe, Sie verstehen meinen Punkt :)
Redben
9

Ich bin mit dieser Art von Weg nicht einverstanden

GET /companies/{companyId}/departments

Wenn Sie Abteilungen erhalten möchten, ist es meiner Meinung nach besser, eine / Abteilungen-Ressource zu verwenden

GET /departments?companyId=123

Ich nehme an, Sie haben eine companiesTabelle und eine departmentsTabelle, dann Klassen, um sie in der von Ihnen verwendeten Programmiersprache abzubilden. Ich gehe auch davon aus, dass Abteilungen anderen Entitäten als Unternehmen zugeordnet werden können. Daher ist eine / abteilungsressource unkompliziert, es ist praktisch, Ressourcen Tabellen zuzuordnen, und Sie benötigen nicht so viele Endpunkte, da Sie sie wiederverwenden können

GET /departments?companyId=123

zum Beispiel für jede Art von Suche

GET /departments?name=xxx
GET /departments?companyId=123&name=xxx
etc.

Wenn Sie eine Abteilung erstellen möchten, wird die

POST /departments

Die Ressource sollte verwendet werden und der Anforderungshauptteil sollte die Firmen-ID enthalten (wenn die Abteilung nur mit einer Firma verknüpft werden kann).

Maxime Laval
quelle
1
Für mich ist dies nur dann ein akzeptabler Ansatz, wenn das verschachtelte Objekt als atomares Objekt sinnvoll ist. Wenn nicht, wäre es nicht wirklich sinnvoll, sie auseinanderzubrechen.
Simme
Dies habe ich gesagt, wenn Sie auch Abteilungen abrufen möchten, dh wenn Sie einen Endpunkt / Abteilungen verwenden.
Maxime Laval
2
Es kann auch sinnvoll sein, das Einbeziehen von Abteilungen durch verzögertes Laden beim Abrufen eines Unternehmens zuzulassen, z. B. GET /companies/{companyId}?include=departmentsda dadurch sowohl das Unternehmen als auch seine Abteilungen in einer einzigen HTTP-Anforderung abgerufen werden können. Fractal macht das wirklich gut.
Matthew Daly
1
Wenn Sie acls einrichten, möchten Sie wahrscheinlich den /departmentsEndpunkt so einschränken , dass nur ein Administrator darauf zugreifen kann, und jedes Unternehmen nur über `/ company / {companyId} / department` auf seine eigenen Abteilungen zugreifen lassen
Cuzox
@MatthewDaly OData macht das auch gut mit $ expand
Rob Grant
1

Rails bietet hierfür eine Lösung: flache Verschachtelung .

Ich denke, das ist gut so, denn wenn Sie direkt mit einer bekannten Ressource arbeiten, müssen Sie keine verschachtelten Routen verwenden, wie in anderen Antworten hier erläutert wurde.

Partydrone
quelle