Mettre en place une API REST 3ème partie

A présent que nous avons une API REST basique, nous allons nous attaquer à la vue xml afin d’exposer ou non des champs.

JMSSerializeBundle

Ce bundle que nous avons déjà installé va nous permettre d’exposer les données en tant qu’xml

L’entité Catégorie

Ici, je dis que, par défaut, je n’expose rien avec  @SerializerExclusionPolicy("ALL")

Je définis aussi la clef du premier noeud d’une catégorie comme étant le terme « category »

J’expose l’id et le titre, mais pas le slug:  @SerializerExpose

Je définis l’id comme attribut de la clef avec  @SerializerXmlAttribute

get-category-xml

Le rendu xml de toutes les catégories

Quand j’appelle toutes les catégories, je suis ennuyé car j’ai les tags <result> et <entry>.

get-categories-xml

Pour changer cela, nous allons créer une classe appelée Categories.php, dans laquelle nous allons formater la vue.

Cette classe étendra une interface qui aura les méthodes getData.

  • J’indique que le tag root sera categories :   @SerializerXmlRoot("categories")
  • J’expose les data :   @SerializerExpose
  • J’indique de quel type seront les data :   @SerializerType("array<AppCoreBundleEntityCategory>")
  • J’indique que la clef de chaque catégorie est category :  @SerializerXmlList(inline=true, entry="category")
  • J’indique que la clef de la liste des catégories, en json, est categories :  @SerializerSerializedName("categories")

Le categoryController

Notre méthode getCategoriesAction renvoie à présent new Categories. Nous allons donc avoir comme résultat cet objet qui aura comme attribut data, qui contiendra toutes les catégories:

get-categories-list-xml

get-categories-list-json

Les paramFetchers

Il est tout à fait possible d’utiliser les paramFetchers pour exécuter des requêtes sur notre API. Ce sont des paramètres que l’on peut utiliser dans l’url, ou envoyer sous forme de filtres dans l’interface générée par nelmio.

Modification de notre GetCategoriesAction

Il faut bien sûr créer la méthode search dans le repository:
get-categories-list-search-xml

La pagination de l’API

A présent, tout est pratiquement en place pour paginer l’API. Il faut pour cela rajouter une nouvelle couche pour encapsuler les résultats fournis par la classe Categories.php, et qui fera appel à pagerFanta, et le tour sera joué.

L’abstractRepository, étendu par tous les repositories

Evolution de la fonction search du repository

A présent, nous retournons un pager, et non plus les résultats, et nous prenons en compte la limit et l’offset.

Evolution de la classe Categories

A présent, notre classe doit rajouter des métas: limit, current_items, total_items et offset, et prendre en argument non pas un tableau de catégories, mais une instance de pagerFanta:

Evolution du contrôleur

Nous devons à présent rajouter deux paramFetcher, limit et offset:

A ce stade, nous n’avons pas encore la pagination, mais nous obtenons ceci en appelant notre API:

get-categories-list-search-meta-xml

La vue paginée

Il est temps de créer la classe qui va mettre en place les métas de pagination en permettant de « naviguer » dans l’API:

N’oublions pas de déclarer le service correspondant:

Que fait ce service ?

La fonction handleRepresentation prend en compte des catégories (qui renvoie un objet Categories comportant les metas limit, current_items, total_items et offset, filtrées avec ces paramFetcher), ainsi que les paramFetchers passés en paramètre.

En fonction des résultats, la fonction getNavigationLinks renvoie les liens first, next, previous, last en modifiant l’offset. Les metas sont alors rajoutées à celles retournées par Categories. Et de nouvelles metas, ajoutées au header, sont injectées: X-total-Count et Link (qui est la concaténation des quatre liens first, next, previous et last).

Mise à jour de la fonction getCategoriesAction du contrôleur des catégories

 

get-categories-list-search-meta-paginated-xml

Comme d’habitude, le code se trouve sur github: https://github.com/jpsymfony/REST-BEHAT

Rédigé par

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *