ReSTful-APIs werden hauptsächlich von anderen Systemen verwendet, weshalb ich Paging-Daten in die Antwortheader eingefügt habe. Einige API-Konsumenten haben jedoch möglicherweise keinen direkten Zugriff auf die Antwortheader oder erstellen möglicherweise eine UX über Ihre API. Daher ist es von Vorteil, eine Möglichkeit zum Abrufen (bei Bedarf) der Metadaten in der JSON-Antwort bereitzustellen.
Ich bin der Meinung, dass Ihre Implementierung standardmäßig maschinenlesbare Metadaten und auf Anfrage lesbare Metadaten enthalten sollte. Die für Menschen lesbaren Metadaten können bei jeder Anforderung zurückgegeben werden, wenn Sie möchten, oder vorzugsweise bei Bedarf über einen Abfrageparameter, zinclude=metadata
oder include_metadata=true
.
In Ihrem speziellen Szenario würde ich den URI für jedes Produkt in den Datensatz aufnehmen. Dies erleichtert dem API-Konsumenten das Erstellen von Links zu den einzelnen Produkten. Ich würde auch einige vernünftige Erwartungen gemäß den Grenzen meiner Paging-Anfragen setzen. Das Implementieren und Dokumentieren von Standardeinstellungen für die Seitengröße ist eine akzeptable Vorgehensweise. Zum Beispiel die API von GitHub legt die die Standardseitengröße auf 30 Datensätze mit maximal 100 fest und legt ein Ratenlimit für die Häufigkeit fest, mit der Sie die API abfragen können. Wenn Ihre API eine Standardseitengröße hat, kann die Abfragezeichenfolge nur den Seitenindex angeben.
In dem für Menschen lesbaren Szenario /products?page=5&per_page=20&include=metadata
könnte die Antwort beim Navigieren zu:
{
"_metadata":
{
"page": 5,
"per_page": 20,
"page_count": 20,
"total_count": 521,
"Links": [
{"self": "/products?page=5&per_page=20"},
{"first": "/products?page=0&per_page=20"},
{"previous": "/products?page=4&per_page=20"},
{"next": "/products?page=6&per_page=20"},
{"last": "/products?page=26&per_page=20"},
]
},
"records": [
{
"id": 1,
"name": "Widget #1",
"uri": "/products/1"
},
{
"id": 2,
"name": "Widget #2",
"uri": "/products/2"
},
{
"id": 3,
"name": "Widget #3",
"uri": "/products/3"
}
]
}
Für maschinenlesbare Metadaten würde ich der Antwort Link-Header hinzufügen :
Link: </products?page=5&perPage=20>;rel=self,</products?page=0&perPage=20>;rel=first,</products?page=4&perPage=20>;rel=previous,</products?page=6&perPage=20>;rel=next,</products?page=26&perPage=20>;rel=last
(Der Link-Header-Wert sollte urlencodiert sein.)
... und möglicherweise einen benutzerdefinierten total-count
Antwortheader, wenn Sie dies wünschen:
total-count: 521
Die anderen Paging-Daten, die in den menschenzentrierten Metadaten angezeigt werden, sind für maschinenzentrierte Metadaten möglicherweise überflüssig, da die Link-Header mir mitteilen, auf welcher Seite ich mich befinde und wie viele Seiten pro Seite vorhanden sind, und ich die Anzahl der Datensätze im Array schnell abrufen kann . Daher würde ich wahrscheinlich nur einen Header für die Gesamtzahl erstellen. Sie können Ihre Meinung später jederzeit ändern und weitere Metadaten hinzufügen.
Abgesehen davon können Sie feststellen, dass ich /index
von Ihrer URI entfernt wurde. Eine allgemein akzeptierte Konvention besteht darin, dass Ihr ReST-Endpunkt Sammlungen verfügbar macht. Am /index
Ende trübt das etwas.
Dies sind nur einige Dinge, die ich beim Konsumieren / Erstellen einer API gerne habe. Hoffentlich hilft das!
"page_count": 20
und{"last": "/products?page=26&per_page=20"}
?Als jemand, der mehrere Bibliotheken für die Nutzung von REST-Diensten geschrieben hat, möchte ich Ihnen die Client-Perspektive geben, warum ich denke, dass das Einschließen des Ergebnisses in Metadaten der richtige Weg ist:
Und ein Vorschlag: Wie bei der Twitter-API sollten Sie die Seitennummer durch einen geraden Index / Cursor ersetzen. Der Grund dafür ist, dass der Client mit der API die Seitengröße pro Anforderung festlegen kann. Ist die zurückgegebene Seitennummer die Anzahl der Seiten, die der Client bisher angefordert hat, oder die Anzahl der Seiten, die die zuletzt verwendete Seitengröße angegeben haben (mit ziemlicher Sicherheit die spätere, aber warum nicht eine solche Mehrdeutigkeit ganz vermeiden)?
quelle
Ich würde empfehlen, Header für das gleiche hinzuzufügen. Das Verschieben von Metadaten in Header hilft dabei, Umschläge wie oder zu entfernen
result
, und der Antworttext enthält nur die Daten, die wir benötigen. Sie können den Link- Header verwenden, wenn Sie auch Paginierungslinks generieren.data
records
Einzelheiten finden Sie unter:
https://github.com/adnan-kamili/rest-api-response-format
Für Swagger-Datei:
https://github.com/adnan-kamili/swagger-response-template
quelle
Fügen Sie einfach in Ihrer Backend-API neue Eigenschaften zum Antworttext hinzu. aus Beispiel .net Kern:
In der Körperreaktion sieht es so aus
}}
quelle
Im Allgemeinen mache ich auf einfache Weise, was auch immer, ich erstelle einen restAPI-Endpunkt, zum Beispiel "localhost / api / method /: lastIdObtained /: countDateToReturn" mit diesen Parametern, Sie können es eine einfache Anfrage machen. im Service, z. .Netz
Wenn ich in Ionic von unten nach oben scrolle, übergebe ich den Nullwert, wenn ich die Antwort erhalte, setze ich den Wert der zuletzt erhaltenen ID und wenn ich von oben nach unten schiebe, übergebe ich die letzte Registrierungs-ID, die ich erhalten habe
quelle