web-dev-qa-db-fra.com

Client HATEOAS avec AngularJS

Je me demandais si certaines fonctionnalités étaient masquées dans Angular ou exposées par certaines bibliothèques tierces afin de créer facilement des clients reposants compatibles HATEOAS.

Sur le côté serveur, j'utilise Spring Data/REST pour produire une API HATEOAS JSON. Consommer, cependant, est une toute autre histoire.

Par exemple, j'ai ces 3 entités:

  • {name, address}
  • Employé {firstName, lastName, employer[Company]}
  • Activité {rate, day, employee[Employee], client[Company]}

et demander une activité (l'entité la plus complexe du modèle) produit quelque chose comme ceci:

{
    links: [],
    content: [{
            rate: 456,
            day: 1366754400000,
            links: [{
                rel: "self",
                href: "http://localhost:8080/api/activities/1"
            },
            {
                rel: "activities.activity.client",
                href: "http://localhost:8080/api/activities/1/client"
            },
            {
                rel: "activities.activity.employee",
                href: "http://localhost:8080/api/activities/1/employee"
            }]
        }]
}

Mon API parle en termes de REST (ressources identifiées par des liens). Une activité a un employé par exemple. Ce que je veux vraiment utiliser est: {rate: 456, day: 1366754400000, employee: {firstName:"xxx", lastName:"xxx" ...}}.

Cependant, comme vous pouvez le voir dans le premier résultat, mon activité ne contient qu'un link destiné à l'employé, pas ses données. Existe-t-il quelque chose dans Angular ou dans une bibliothèque tierce pour résoudre ces liens et incorporer les données résultantes?

Des commentaires à ce sujet?

Merci d'avance!

30
Rolf

Commander angular-hateoas . ITs un module AngularJS pour l’utilisation de $ resource avec une API REST activée par HATEOAS.

20
Farm

Vous pouvez écrire une transformation de réponse qui inspecterait l'objet renvoyé, rechercherait des liens et les résoudre avant de renvoyer la réponse. Voir la section "Transformation des demandes et des réponses" dans la documentation du service $ http .

Quelque chose comme ça:

transformResponse: function(rawData) {
  var json = JSON.parse( rawData );
  forEach( json.content.links, function(link) {
    // resolve link...
  });
  return json;
}

Etant donné que l’étape "résoudre le lien" est elle-même un appel $ http, les sous-références seraient également résolues. CEPENDANT, comme ils sont asynchrones, vous renverriez probablement une promesse au lieu de la valeur réelle; Je ne sais pas si la fonction de transformation est autorisée à le faire.

Comme @charlietfl l'a fait remarquer, notez toutefois que cela entraînera plusieurs appels HTTP pour renvoyer une seule entité. Même si j'aime bien le concept de HATEOAS, cela entraînera probablement une lenteur si trop d'appels sont passés. Je suggérerais que votre serveur renvoie les données, ou une partie de celles-ci, directement, PLUS le lien pour plus de détails.

7
st.never

Sur la base de votre commentaire sur le fait de vouloir utiliser des données plutôt que des liens sur le client, je pense que Restangular conviendrait parfaitement.

2
Pankaj Tandon

J'utilise angular-hal pour l'un de mes projets. C'était un backend HATEOAS de printemps. Et je n'ai rencontré aucun problème. Il gère les ressources paramétrées. Je soupçonne qu’il ne prend en charge que HAL, donc, puisque vous utilisez Spring Data Rest, vous devez probablement le configurer pour générer des réponses conformes à HAL.

1
user3408654

Je pense que la confusion est peut-être liée au fait que vous demandez une solution Angular, alors que vous souhaitez réellement faire en sorte que Spring Data envoie une réponse JSON plus complète. En d'autres termes, vous souhaitez simplement que le serveur renvoie les données relatives aux employés dans le cadre de la réponse JSON, plutôt que de demander au client d'effectuer des opérations supplémentaires pour le rechercher. Je ne sais pas quel magasin de données vous utilisez dans Spring Data, mais la solution générale serait d’ajouter une méthode publique getEmployee () à votre classe d’activité, puis d’annoter la méthode avec @RelatedTo et @Fetch (ce serait la Neo4J - peut être différentes annotations pour votre goût des données de printemps). Cela devrait amener Spring HATEOAS à inclure l'enregistrement Employé dans la réponse pour/activité. J'espère que cela t'aides. 

0
Adam Policky