La Pagination de la réponse de la charge utile à partir d'une API RESTful
Je veux soutenir la pagination dans mon API RESTful.
Mon API méthode doit retourner un JSON liste de produits par /products/index
. Cependant, il y a potentiellement des milliers de produits, et je veux à la page grâce à eux, donc, ma demande doit ressembler à quelque chose comme ceci:
/products/index?page_number=5&page_size=20
Mais en quoi ma réponse JSON besoin de ressembler? Serait API habituellement, les consommateurs attendent de la pagination des méta-données dans la réponse? Ou est seulement une gamme de produits nécessaires? Pourquoi?
Il ressemble à l'API Twitter comprend des méta-données: https://dev.twitter.com/docs/api/1/get/lists/members (voir Exemple de Demande).
Avec des méta-données:
{
"page_number": 5,
"page_size": 20,
"total_record_count": 521,
"records": [
{
"id": 1,
"name": "Widget #1"
},
{
"id": 2,
"name": "Widget #2"
},
{
"id": 3,
"name": "Widget #3"
}
]
}
Seulement une gamme de produits (pas de méta-données):
[
{
"id": 1,
"name": "Widget #1"
},
{
"id": 2,
"name": "Widget #2"
},
{
"id": 3,
"name": "Widget #3"
}
]
Vous devez vous connecter pour publier un commentaire.
ReSTful Api sont consommés principalement par les autres systèmes, c'est pourquoi j'ai mis la pagination des données dans les en-têtes de réponse. Cependant, certaines API, les consommateurs ne peuvent pas avoir un accès direct pour les en-têtes de réponse, ou peut-être la construction d'un UX au-dessus de votre API, ainsi qu'en fournissant un moyen de récupérer (sur demande) les métadonnées dans la réponse JSON est un plus.
Je crois que votre mise en œuvre devrait inclure lisibles à la machine de métadonnées par défaut, et lisible par l'homme, les métadonnées lors de la demande. L'lisible par l'homme, les métadonnées peuvent être retournés avec à chaque demande, si vous le souhaitez, ou, de préférence, à la demande via un paramètre de requête, comme
include=metadata
ouinclude_metadata=true
.Dans votre scénario, je dirais l'URI pour chaque produit avec l'enregistrement. Cela rend plus facile pour les API des consommateurs pour créer des liens vers les produits individuels. Je voudrais également mettre quelques attentes raisonnables que par les limites de ma pagination à la demande. La mise en œuvre et documenter les paramètres par défaut pour la taille de la page est une pratique acceptable. Par exemple, L'API GitHub définit la taille de page par défaut de 30 enregistrements avec un maximum de 100, plus fixe un taux limite sur le nombre de fois où vous pouvez interroger l'API. Si votre API a une taille de page par défaut, puis la chaîne de requête pouvez simplement spécifier l'index de la page.
Dans la lisible par l'homme, scénario, lors de la navigation à
/products?page=5&per_page=20&include=metadata
, la réponse pourrait être:Lisibles par machine pour les métadonnées, je voudrais ajouter Lien des en-têtes à la réponse:
(le Lien valeur d'en-tête doit être urlencoded)
...et peut-être une coutume
total-count
en-tête de réponse, si vous le souhaitez:L'autre pagination des données a révélé dans l'homme centrée sur les métadonnées peuvent être superflu, pour la machine, centrée sur les métadonnées, ainsi que le lien des en-têtes laissez-moi savoir à quelle page je suis sur et le nombre par page, et je peux rapidement récupérer le nombre d'enregistrements dans le tableau. Donc, je serais probablement seulement créer un en-tête pour le nombre total. Vous pouvez toujours changer d'avis plus tard et en rajouter.
Que d'un côté, vous remarquerez peut-être que j'ai supprimé
/index
de votre URI. Généralement, la convention est d'avoir votre point de terminaison ReST exposer des collections. Ayant/index
à la fin brouille que légèrement.Ce sont juste quelques choses, je tiens à avoir lors de la consommation d'/création d'une API. Espérons que ça aide!
"page_count": 20
et{"last": "/products?page=26&per_page=20"}
?Comme quelqu'un qui a écrit plusieurs bibliothèques pour consommer des services REST, permettez-moi de vous donner le point de vue du client sur pourquoi je pense que l'emballage de la suite dans les métadonnées est le chemin à parcourir:
Et une suggestion: Comme le L'API Twitter, vous devez remplacer le page_number avec un droit d'index/curseur. La raison en est, l'API permet au client de définir la taille de page par demande. Est le retour de l'page_number le nombre de pages que le client a demandé jusqu'à présent, ou le numéro de la page donnée, la dernière page_size (presque certainement le plus tard, mais pourquoi ne pas éviter cette ambiguïté en tout)?
Je recommande l'ajout d'en-têtes pour le même. Déplacement des métadonnées pour les en-têtes aide à se débarrasser de l'enveloppe comme
result
,data
ourecords
et le corps de la réponse ne contient que les données dont nous avons besoin. Vous pouvez utiliser Lien en-tête si vous générez la pagination trop de liens.Pour plus de détails, consultez:
https://github.com/adnan-kamili/rest-api-response-format
Pour swagger fichier:
https://github.com/adnan-kamili/swagger-response-template
généralement, je le fais par simple voie, que ce soit, j'ai créer un restAPI point de terminaison par exemple, "localhost/api/méthode/:lastIdObtained/:countDateToReturn"
à ces paramètres, vous pouvez faire une simple demande.
dans le service, par exemple. .net
Ionique, quand j'ai faites défiler de haut en bas, je passe la valeur zéro, quand je reçois la réponse, j'ai mis la valeur du dernier id obtenu, et quand je glisse de haut en bas, je passe le dernier numéro d'inscription j'ai eu