Wir schreiben unsere erste Nicht-XML-API und ich möchte nach den Best Practices für die Darstellung verwandter Ressourcen in der API fragen. Lassen Sie mich es auf einer user
Ressource und der damit verbundenen Ressource - organization
erklären.So halten Sie die Repräsentation von FKs in Eingabe/Ausgabe einheitlich (RESTful JSON API)
In XML das ist ziemlich einfach:
Antwortkörper (GET) - es enthält auch Ressourcen-IDs als URIs:
GET /users/321/ <?xml version="1.0" encoding="UTF-8" ?> <user> <!-- ... ---> <organization name="Lorem Ipsum Ltd." href="/organizations/123/">123</organization> </user>
anfordern Körper (POST/PUT/PATCH) - verwendet IDs:
PATCH /users/321 ...&organization=123
URI Filter - verwendet IDs von verwandten Ressourcen:
GET /users/?organization=123 <?xml version="1.0" encoding="UTF-8" ?> <users> <!-- ... ---> </users>
Jetzt, da JSON keine Attribute verwenden, es ist keine 1: 1-Übergang.
Antwortkörper (GET):
Statt IDs als Werte verwenden, wechselten wir zu URIs, um die Verbundenheit Prinzip der REST einzuhalten:
GET /users/321/ { ..., "organization": "/organizations/123" }
Anfragetext (POST/PUT/PATCH) - akzeptiert URIs (Beispiel aus Gründen der Lesbarkeit nicht codiert):
PATCH /users/321 ...&organization=/organizations/123/
URI-Filter - um die URIs sauber zu halten, wir IDs noch statt URIs verwenden, wenn sie über GET-Parameter Filterung:
GET /users/?organization=123 { "users": [ ... ] }
Das letzte Bit die Gleichförmigkeit des Wertes bricht (ID vs. URI) zwischen Anfrage und Antwort, aber wir bevorzugen die Verwendung von IDs anstelle von URIs, weil IDs lesbarer sind und weil es Fälle geben kann, in denen wir mehr als einen Wert in einen Filter setzen müssen (z. B. ?organization__in=123,124
).
Also meine Frage ist, Wie halten Sie Anfrage/Antwort Darstellung der zugehörigen Ressourcen einheitlich über Ihre API? Best Practices, Standards oder nur gesunder Menschenverstand? Oder ist das Obige vielleicht eine unnötige Sorge?
bearbeiten: Um zu klären, ich frage, wie würden Sie die API in Bezug auf die URI-Struktur (GET-Parameter) Design und das Format der Request/Response-Daten. Ich bin nicht fragen über die technische Umsetzung.
Ein Ansatz ist es, zu einer ausführlicheren Darstellung zu wechseln, die Benutzern der API ein bisschen mehr Daten gibt, aber es löst immer noch nicht das Uniformitätsproblem. Beispiel:
GET /users/321/
{
...,
"organization": {
"ud": 123,
"name": "Lorem Ipsum Ltd.",
"uri": "/organizations/123"
}
}
Hinweis - ähnliche Frage (nicht kopieren): REST API - include related object details or just ID's
Wenn Sie nach Einheitlichkeit fragen, korrigiere ich Sie über Objekte hinweg? – Jeff
Wenn Sie _across objects_ zwischen Objekten bedeuten, die über Fremdschlüssel verknüpft sind, dann ja. – MicE
Die Frage zeigt URI-Format für eine Abfrage, die Benutzer nach Organisation filtert - ''/users /? Organization = 123''. Die Abfrage verwendet die Organisation _ID_ im GET-Parameter, während die Antwort eine _URI_ dieser Organisation anstelle nur ihrer _ID_ enthält. Dies ist die Inkonsistenz, auf die ich hinweise, und ich suche Ratschläge dazu, wie dies üblicherweise gehandhabt wird - d. H. Es einheitlich halten und entweder IDs oder URIs verwenden; oder mach dir keine Sorgen darüber und mische es; oder etwas anderes. – MicE