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!