Recommandations de l'API REST - Exemples de conception de services Web dans Java et Spring

Dans le dernier article de cette série, vous découvrirez les recommandations de l'API REST et les exemples de développement des services Web Java et Spring.

Lors du développement d'une bonne API REST, il est important d'avoir de bons microservices.
Comment développez-vous votre API REST? Quelles sont les meilleures pratiques?


Vous apprendrez:


  • Comment dĂ©velopper une bonne API REST?
  • À quoi dois-je penser lors du dĂ©veloppement d'une API REST?
  • Quelles sont les meilleures pratiques pour dĂ©velopper des services Web RESTful?

API REST


Voici le dernier article d'une série d'articles sur l'API REST:


Utilisez l'approche du consommateur d'abord


Qui utilisera votre service? Services aux consommateurs.

Considérez-vous le service du point de vue du consommateur?

  • Si vous dĂ©veloppez une API, votre consommateur peut-il comprendre votre API?
  • Si vous publiez vos ressources, le consommateur peut-il les trouver et y accĂ©der?
  • Le consommateur peut-il comprendre vos URI?
  • Quel type de service proposez-vous?
  • S'agit-il d'une application mobile ou d'une application web?
  • À quels consommateurs vous attendez-vous et ces types de consommateurs peuvent-ils changer Ă  l'avenir?
  • Si vous implĂ©mentez quelque chose comme HATEOAS, rĂ©flĂ©chissez Ă  la façon dont vos clients l'utiliseront avant de l'implĂ©menter.

  • La chose la plus importante est d'avoir une excellente documentation
  • Facilitez la tĂąche de vos clients pour vous faire gagner du temps.
  • Plus les consommateurs peuvent faire seuls, moins de travail pour vous.


Chaque fois que vous avez une discussion ou une révision de service, mettez les exigences des clients en premier lieu.

Utilisez l'approche du contrat d'abord


Qu'est-ce qu'un contrat?

Le créateur du service Web est considéré comme un fournisseur de services . Une application qui utilise un service Web est un consommateur du service . Un contrat est un accord entre un fournisseur et un consommateur sur un service.



Afin d'utiliser correctement le service, le consommateur du service doit bien comprendre le contrat. Le contrat comprend des détails sur de nombreux aspects du service, tels que:

  • Comment appeler un service Web?
  • Quel type de transport est utilisĂ©?
  • Quelles sont les structures de demande et de rĂ©ponse?

Cela s'appelle également une définition de service .

Dans l'approche du contrat d'abord, vous définissez d'abord un contrat de service, puis implémentez uniquement le service.

Contrat d'abord avec WSDL


Par exemple, lorsque vous définissez des services Web SOAP, vous utilisez WSDL pour définir le contrat.



Le WSDL détermine quels sont les points de terminaison de service, les opérations que vous publiez et les structures de demande et de réponse.

Contrat d'abord avec Swagger / Open API


Lorsque vous utilisez des services Web RESTful, Swagger est un outil populaire pour documenter vos services Web.



Swagger vous permet de déterminer les ressources que vous fournissez dans le cadre de votre API. Il inclut les détails de chaque opération, par exemple, si elle utilise XML, JSON ou les deux. Un plan de réponse est également là.



Il donne également des informations détaillées sur les codes de réponse qu'il prend en charge. Vous pouvez également voir que cette ressource particuliÚre, / jpa / users :



prend en charge le fonctionnement GET. En fait, il prend également en charge l'opération POST:



Le schéma de réponse, si cette ressource est disponible, sera:



La définition de l'objet Utilisateur est présente dans l'accord Swagger comme:



Il comprend des attributs: birthDate , id , name et un tableau de messages de messages. Certains champs contiennent Ă©galement un champ de description.

Dans l'approche du contrat d'abord, avant d'implémenter le service, vous créez manuellement ou à l'aide de l'application la définition créée par Swagger.

Avantages de l'approche du contrat d'abord


En utilisant l'approche du contrat d'abord, vous pensez Ă  vos clients et Ă  la façon dont ils peuvent utiliser ce service. Vous n'ĂȘtes pas initialement inquiet des dĂ©tails de mise en Ɠuvre.

Si, Ă  un stade prĂ©coce, vous accordez une grande importance Ă  la mise en Ɠuvre, les dĂ©tails techniques pĂ©nĂštrent la dĂ©finition de votre service.

Vous devez vous assurer que la définition de votre service ne dépend pas de la plate-forme que vous utilisez, que ce soit Java, .NET ou toute autre.

DĂ©finir les normes d'organisation pour l'API REST


YARAS est une directive importante pour vos normes organisationnelles.



YARAS signifie Yet Another RESTful API Standard . YARAS fournit les normes, directives et conventions à suivre lors du développement de services Web RESTful. Il donne des recommandations pour les choses suivantes:

  • Comment nommer vos services
  • Comment structurer votre demande et votre rĂ©ponse
  • Comment mettre en Ɠuvre le filtrage, le tri, la pagination et d'autres actions
  • Comment aborder le versioning
  • Comment devez-vous aborder la documentation de l'API

Approche unifiée du développement des services


Vous devez résoudre de nombreux problÚmes complexes avant de commencer à concevoir des services Web RESTful. Tout ce qui précÚde, vous devez le savoir.

Le leadership de votre organisation ne voudra pas que les équipes qui traitent de ressources différentes aient des approches différentes de ces choses.

Par exemple, il n'est pas souhaitable que Team-A organise le contrĂŽle de version en fonction des paramĂštres de requĂȘte et Team-B utilise le contrĂŽle de version en fonction de l'URI.

Par conséquent, il est important que vous ayez clairement défini des normes organisationnelles pour votre approche des services Web RESTful.

Personnalisation de YARAS SOUS les besoins organisationnels


La bonne chose Ă  propos de YARAS est qu'il peut ĂȘtre personnalisĂ© pour rĂ©pondre aux besoins spĂ©cifiques de l'organisation. Par exemple, vous pouvez:

  • Configurez Ă  quoi devraient ressembler les corps de demande et de rĂ©ponse.
  • Choisissez un systĂšme de contrĂŽle de version spĂ©cifique

Étant donnĂ© que YARAS a une couverture assez complĂšte, vous pouvez ĂȘtre sĂ»r que vous n'avez manquĂ© aucune dĂ©cision importante.

Choix d'un cadre standard d'entreprise API REST


Les frameworks typiques utilisés pour créer des services Web RESTful dans le monde Java sont Spring MVC, Spring REST et JAX-RS.

Si vous créez un framework / archétype / application de référence spécifique à l'organisation qui adhÚre aux normes d'organisation communes en plus de votre plate-forme API REST préférée, cela permettra aux équipes d'adhérer facilement aux normes communes.

Les caractéristiques typiques incluent:

  • Structures de demande et de rĂ©ponse
  • Gestion des erreurs
  • filtrage
  • Chercher
  • Versioning
  • Prise en charge des fausses rĂ©ponses
  • Hateoas

Le cadre standard fournit une approche unifiĂ©e de la conception et de la mise en Ɠuvre des services dans toute l'organisation.

Gestion d'API REST décentralisée


Créez un groupe d'experts parmi les équipes créant l'API REST et formez une équipe de gestion. L'équipe est responsable de

  • AmĂ©lioration des normes API REST
  • CrĂ©ation / conception de votre infrastructure API REST

Utilisation généralisée de HTTP


Chaque fois que vous pensez aux services Web RESTful, pensez au HTTP.

HTTP possÚde toutes les fonctionnalités qui vous aident à créer d'excellents services Web.

Utilisez les bonnes mĂ©thodes de requĂȘte HTTP


Pensez aux mĂ©thodes de requĂȘte HTTP que vous devez utiliser. Lorsque vous pensez Ă  implĂ©menter une opĂ©ration, dĂ©terminez la ressource sur laquelle elle doit ĂȘtre effectuĂ©e, puis recherchez la mĂ©thode de requĂȘte HTTP appropriĂ©e. RĂ©cupĂ©rez-vous des dĂ©tails, crĂ©ez-vous quelque chose, mettez-vous Ă  jour quelque chose existant ou supprimez-vous un existant?

Utilisation de méthodes HTTP:

  • OBTENIR pour obtenir
  • POST pour crĂ©er
  • PUT Ă  mettre Ă  jour
  • SUPPRIMER pour supprimer
  • PATCH pour les mises Ă  jour partielles

Utilisez l'état de réponse HTTP approprié


Lorsque vous effectuez l'opération, assurez-vous de renvoyer l'état de réponse correct.

Par exemple, lorsqu'une ressource spécifique n'est pas trouvée, ne lancez pas d'exception de serveur. Envoyez plutÎt le code de réponse approprié dans un message de réponse, tel que 404 .

S'il y a vraiment une exception de serveur, renvoyez le code 500 .

Si la validation Ă©choue, envoyez le code de la demande non valide.

Focus sur la performance


Chaque ressource peut avoir plusieurs représentations - au format XML ou JSON. Le consommateur de services peut choisir la présentation de son choix.

Le service renvoie 3 utilisateurs lorsque nous envoyons une demande GET. Dans ce cas, nous obtenons la représentation JSON de la ressource / users .



Lorsque le consommateur n'indique pas de vue préférée, nous utilisons JSON.



Le consommateur peut envoyer un en-tĂȘte Accept pour indiquer la vue.



Le corps de la réponse a désormais un contenu XML:



Utilisez le pluriel


Utilisez toujours le pluriel lorsque vous nommez des ressources.

Regardons un exemple simple. Supposons que nous ayons un service qui héberge une ressource utilisateur. Ce qui suit décrit comment y accéder:

  • CrĂ©er un utilisateur: POST / utilisateurs
  • Supprimer un utilisateur: SUPPRIMER / utilisateurs / 1
  • Obtenez tous les utilisateurs: GET / utilisateurs
  • Obtenez un utilisateur: GET / users / 1

La préférence de plusieurs utilisateurs par rapport à l'utilisateur utilisateur rend l'URI plus lisible.

  • Par exemple, si nous utilisons / user au lieu de / users pour obtenir, GET / user ne transmet pas le bon message au lecteur.

Créer une bonne documentation


Les consommateurs doivent comprendre comment faire le meilleur usage du service, et la meilleure façon de les aider est de créer une bonne documentation.

Les services Web SOAP peuvent utiliser la fonctionnalité WSDL, tandis que les services Web RESTful ont des options Swagger (désormais la norme de documentation Open API).

Le choix d'un format n'est qu'une partie de la création d'une bonne documentation. Ce qui est également important, c'est de fournir la bonne quantité d'informations pour aider le consommateur.

La documentation doit ĂȘtre complĂšte et inclure les points suivants:

  • Qu'est-ce qu'une structure de demande et de rĂ©ponse?
  • Comment un consommateur doit-il s'authentifier?
  • Quelles sont les limites d'utilisation?
  • Indiquez tous les types de messages de rĂ©ponse et les codes d'Ă©tat correspondants qui peuvent ĂȘtre attendus du service.

Créer un portail de documentation API REST commun


Il serait utile d'avoir un portail de documentation API REST commun à l'ensemble de l'organisation. Jetez un Ɠil à l'un de ces portails:



Un tel portail regroupe toutes les ressources disponibles dans l'organisation. Avoir une interface utilisateur telle que l'interface utilisateur Swagger aura ses avantages supplĂ©mentaires. À l'aide de l'interface utilisateur Swagger, vous pouvez voir la documentation plus en dĂ©tail:



Cela peut ĂȘtre utilisĂ© mĂȘme par des utilisateurs non techniques. Les informations fournies ici comprennent:

  • Format de rĂ©ponse attendu
  • Type de contenu
  • Codes de rĂ©ponse pris en charge

Le format de la documentation dans le style d'une demande / rĂ©ponse en direct peut Ă©galement ĂȘtre intĂ©ressant.

Prise en charge des versions


Le contrĂŽle de version entraĂźne une grande complexitĂ© pour un service Web. Il est trĂšs difficile de gĂ©rer plusieurs versions diffĂ©rentes du mĂȘme service Web. Essayez d'Ă©viter cela autant que possible.

Cependant, dans certains scénarios, le contrÎle de version est inévitable.

Commençons par regarder un exemple de service. Supposons que nous ayons initialement défini un service qui a la classe PersonV1 comme suit:

Cette version de la classe ne prend pas en compte le fait qu'un nom peut avoir plusieurs sous-sections, telles que le prénom et le nom. Vérifiez ceci:

La deuxiÚme version de la classe source a été mise à jour pour corriger cette anomalie:

Nous ne pouvons pas transférer immédiatement l'ensemble du service pour utiliser PersonV2 ! Il est possible que d'autres consommateurs attendent des réponses au format PersonV1 .

C'est lĂ  que le contrĂŽle de version est requis.

Voyons maintenant les options que nous avons pour le contrĂŽle de version de ces deux ressources.

Utilisation de différents URI


Nous avons une option: utiliser différents URI pour ces différentes ressources. Dans le code d'examen ci-dessous, nous utilisons les URI v1 / personne et v2 / personne pour les distinguer:

Si vous exécutez une demande GET pour la ressource v1 / personne :



Vous recevrez des informations correspondant Ă  la v1 . Pour une autre ressource:



Utilisation du paramĂštre de requĂȘte


La deuxiĂšme mĂ©thode de contrĂŽle de version utilise le paramĂštre de requĂȘte:

Dans l'URI / personne / param , si nous envoyons le paramĂštre avec version = 1 , nous retournons une ressource de type PersonV1 :



Pour le mĂȘme URI, le paramĂštre avec version = 2 renvoie une ressource de type PersonV2 :



Cette mĂ©thode est appelĂ©e versioning Ă  l'aide de paramĂštres de requĂȘte.

Utilisation d'un en-tĂȘte (en-tĂȘte)


Une autre façon de procĂ©der consiste Ă  contrĂŽler la version en spĂ©cifiant un titre. Ici, nous utilisons un en-tĂȘte appelĂ© X-API-VERSION et marquons l'URI comme / person / header . Lorsque la valeur d'en-tĂȘte est 1 , une ressource de type PersonV1 est renvoyĂ©e :



Lorsque sa valeur est 2 , une ressource de type PersonV2 est récupérée:



Nous utilisons l'attribut dans l'en-tĂȘte de demande pour effectuer le contrĂŽle de version pour nous.

Utilisation de l'en-tĂȘte d'acceptation


La derniĂšre mĂ©thode pour crĂ©er des versions utilise l'en-tĂȘte Accepter. Si le consommateur inclut les informations de premiĂšre version dans l'en-tĂȘte Accept de la demande GET, la ressource suivante est renvoyĂ©e:



Sinon, une ressource de type PersonV2 est retournée :



Cette mĂ©thode de contrĂŽle de version est appelĂ©e Accepter la version d'en-tĂȘte ou Version de type de support , car les types MIME sont gĂ©nĂ©ralement le contenu de l'en-tĂȘte Accepter.

Comparaison des méthodes de contrÎle de version


Jusqu'à présent, nous avons vu quatre types de méthodes dans les versions:

  • Utilisation de diffĂ©rents URI
  • Utilisation du paramĂštre de requĂȘte
  • Utilisation de l'en-tĂȘte
  • Utilisation de Accept Header / Media Type

Lequel est le meilleur? La vérité est qu'il n'y a pas de réponse unique à cette question. Le fait est que différents géants de l'Internet fréquentent différents types de versions.

  • Utilisation de diffĂ©rents URI - Twitter
  • Utilisation du paramĂštre de requĂȘte - Amazon
  • Utilisation d'un en-tĂȘte - Microsoft
  • Utilisation de Accept Header / Media Type - GitHub


Vous devez évaluer ces quatre options en fonction de vos besoins spécifiques. Il y a un certain nombre de facteurs importants à considérer:

  • Pollution URI : En contrĂŽlant les versions Ă  l'aide d'URI et de paramĂštres de requĂȘte, nous finissons par polluer l'espace URI. En effet, nous ajoutons des prĂ©fixes et des suffixes aux chaĂźnes principales de l'URI. Le contrĂŽle de version Ă  l'aide d'un en-tĂȘte Ă©vite cela.
  • Utilisation abusive des en-tĂȘtes HTTP . Dans le cas du contrĂŽle de version utilisant des en-tĂȘtes et le type de support, les en-tĂȘtes HTTP sont mal utilisĂ©s car ils n'Ă©taient pas initialement destinĂ©s au contrĂŽle de version.
  • Mise en cache : une ressource est identifiĂ©e par son URI. Toutefois, si vous n'utilisez pas d'URI pour dĂ©terminer sa version, mais utilisez un mĂ©canisme basĂ© sur l'en-tĂȘte, les informations de version ne peuvent pas ĂȘtre mises en cache. Si la mise en cache HTTP est importante pour vous, utilisez le contrĂŽle de version basĂ© sur un URI ou un paramĂštre de demande.
  • ExĂ©cutabilitĂ© de la demande de navigateur : le versioning basĂ© sur le titre et le type de support nĂ©cessite des outils comme Postman. Cependant, si les consommateurs de services ne sont pas techniquement avertis, il est prĂ©fĂ©rable d'utiliser le contrĂŽle de version basĂ© sur un URI ou un paramĂštre de requĂȘte.
  • Documentation API : Vous devez Ă©galement rĂ©flĂ©chir Ă  la façon dont vous souhaitez documenter vos API. Le contrĂŽle de version basĂ© sur l'URI et le paramĂštre de requĂȘte est plus facile Ă  documenter que les deux autres types de contrĂŽle de version.

Comprenez qu'il n'y a pas de solution idéale unique!

Pensez Ă  la gestion des erreurs


Lorsqu'un consommateur soumet une demande à un service, il est important qu'il reçoive la bonne réponse. Chaque fois que quelque chose se passe mal, il est important d'envoyer une réponse appropriée.

Lorsqu'un consommateur demande une ressource inexistante


Si nous envoyons une demande GET pour rechercher un utilisateur existant, nous obtenons la réponse suivante:



Si vous recherchez un utilisateur inexistant:



Ce que vous obtenez est le statut 404 Not Found . Il s'agit d'une bonne gestion des erreurs car elle détermine correctement que la ressource n'a pas été trouvée et ne renvoie pas d'erreur de serveur.

Envoyons maintenant une requĂȘte GET Ă  un URI inexistant:



Comme vous pouvez le voir, vous obtenez 404 statuts de réponse non trouvés . Une URL non valide indique une ressource qui n'existe pas.

Statuts de réponse importants


  • 200 - succĂšs
  • 404 - ressource introuvable
  • 400 - demande non valide (par exemple, erreur de validation)
  • 201 - crĂ©Ă©
  • 401 - non autorisĂ© (si l'authentification Ă©choue)
  • 500 - erreur de serveur

Détails de l'erreur dans le corps de réponse


Cela est utile si vous disposez d'une structure d'exception standard lors du développement de votre service.



Pour des erreurs spĂ©cifiques, des structures de rĂ©ponse spĂ©cifiques peuvent ĂȘtre renvoyĂ©es au consommateur, ce qui peut ĂȘtre la norme dans toute l'organisation. Assurez-vous que la rĂ©ponse d'erreur est Ă©galement lisible pour les consommateurs, sans confusion.

Utilisation de la documentation Swagger ou Open API


Swagger fournit l'un des formats de documentation les plus populaires pour les services Web RESTful. Aujourd'hui, il est soutenu par diverses organisations et est utilisé dans un grand nombre de services. Nous examinons ici deux aspects principaux de Swagger:

  • Format de documentation Swagger
  • Swagger UI, qui vous permet de consulter la documentation Swagger d'une maniĂšre visuellement pratique

Documentation Swagger


Jetez un Ɠil au Swagger JSON suivant:



Au niveau supérieur, cela ressemble beaucoup à la définition de WSDL. Il a plusieurs attributs importants:
  • hĂŽte : oĂč se trouve le service
  • basePath : le chemin d'accĂšs au service
  • consomme : quelles demandes sont acceptĂ©es



  • produit : Quels types de rĂ©ponses sont gĂ©nĂ©rĂ©s



  • chemins : diffĂ©rentes ressources disponibles Dans ce cas, vous avez plusieurs types de ressources dans la liste:



Swagger, , , :



/users GET POST . GET . :



, 200 User . User definitions () :



Swagger , RESTful -. JSON.

Swagger UI


Swagger UI — , Swagger - RESTful. :



, - . :



, :



, URL :



GET , :



, . birthDate , id , links , name posts . :



Swagger ( Open API)


Swagger — , . , , : :



Swagger contract-first, code-first.

.

Résumé


RESTful -.


Be the BEST at Your REST API!

Developing REST APIs

Source: https://habr.com/ru/post/fr483374/


All Articles