Plusieurs concepts liés au conflit REST dans ma tête lorsque j'essaye de l'implémenter.
J'ai un système d'API back-end REST-ful qui contient la logique métier et une application Web qui fournit l'interface utilisateur. À partir de diverses ressources sur REST (en particulier, REST en pratique: hypermédia et architecture de systèmes ), je sais que je ne devrais pas exposer les identificateurs bruts de mes entités, mais plutôt renvoyer des hyperliens avec rel="self"
.
Prenons l'exemple. L'API REST a une ressource qui renvoie une personne:
<Person>
<Links>
<Link rel="self" href="http://my.rest.api/api/person/1234"/>
</Links>
<Pets>
<Link rel="pet" href="http://my.rest.api/api/pet/678"/>
</Pets>
</Person>
Le problème se pose avec l'application Web. Supposons qu'il renvoie une page contenant un lien hypertexte vers les navigateurs:
<body class="person">
<p>
<a href="http://my.web.app/pet/???????" />
</p>
</body>
Que dois-je mettre dans l' href
attribut? Comment conserver l'URL de l'entité API dans l'application Web pour pouvoir obtenir l'entité lorsqu'un utilisateur ouvre la page cible?
Les exigences semblent contradictoires:
- Le lien hypertexte
href
doit conduire à l'application Web car il s'agit du système hébergeant l'interface utilisateur - Le
href
doit avoir un identifiant de l'entité, car l'application Web doit pouvoir s'adresser à l'entité lorsque la page cible s'ouvre - L'application Web ne doit pas analyser / construire d'URL REST car elle n'est pas conforme à REST, dit le livre mentionné
Les URI doivent être opaques pour les consommateurs. Seul l'émetteur de l'URI sait comment l'interpréter et le mapper à une ressource.
Donc, je ne peux pas simplement prendre à 1234
partir de l'URL de réponse de l'API, car en tant que client RESTful, je dois le traiter comme s'il s'agissait de quelque chose http://my.rest.api/api/AGRIDd~ryPQZ^$RjEL0j
. D'un autre côté, je dois donner une URL qui mène à mon application Web et suffit pour que l'application restaure en quelque sorte l'URL d'origine de l'API et utilise cette URL pour accéder aux ressources de l'API.
La manière la plus simple consiste probablement à utiliser les URL API des ressources comme identificateurs de chaîne. Mais les URL des pages Web comme http://my.web.app/person/http%3A%2F%2Fmy.rest.api%2Fapi%2Fperson%2F1234
sont laides.
Tout cela semble assez facile pour une application de bureau ou une application javascript à une seule page. Puisqu'ils vivent en continu, ils peuvent simplement conserver les URL en mémoire avec les objets de service pour la durée de vie de l'application et les utiliser si nécessaire.
Avec une application web, j'imagine plusieurs approches, mais toutes semblent étranges:
- Remplacez l'hôte dans les URL de l'API et conservez le résultat uniquement. L'énorme inconvénient est qu'il nécessite que l'application Web gère toute URL générée par l'API, ce qui signifie un couplage monstrueux. De plus, ce n'est plus RESTful, car mon application web commence à interpréter les URL.
- Exposez les ID bruts dans l'API REST avec les liens, utilisez-les pour créer les URL de Web App, puis utilisez les ID sur le serveur d'applications Web pour trouver les ressources requises dans l'API. C'est mieux, mais cela affectera les performances du serveur d'application Web car l'application Web devra passer par la navigation du service REST en émettant une chaîne de demandes get-by-id d'une certaine forme pour gérer toute demande provenant d'un navigateur. Pour une ressource quelque peu imbriquée, cela peut être coûteux.
- Stockez toutes les
self
URL renvoyées par l'API dans un mappage persistant (DB?) Sur le serveur d'applications Web. Générez des identifiants pour eux, utilisez-les pour créer les URL des pages d'applications Web et obtenir les URL des ressources du service REST. C'est-à-dire que je garde l'http://my.rest.api/pet/678
URL quelque part avec une nouvelle clé, disons3
, et que je génère l'URL de la page Web en tant quehttp://my.web.app/pet/3
. Cela ressemble à une implémentation de cache HTTP d'une certaine sorte. Je ne sais pas pourquoi, mais cela me semble bizarre.
Ou cela signifie-t-il que les API RESTful ne peuvent pas servir de backends pour les applications Web?