HATEOAS client avec AngularJS

Je me demandais s'il y avait des fonctionnalités cachées dans Angular ou exposées par certaines bibliothèques tierces pour créer facilement des clients Restful conformes à HATEOAS.

Côté backend, j'utilise Spring Data / REST pour produire une API HATEOAS JSON. La consommer, cependant, est une toute autre histoire.

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

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

Et demandant une activité (le plus entité 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 la première sortie, mon activité ne contient qu'un lien vers l'employé, pas ses données. Y a-t-il quelque chose dans Angular ou dans une bibliothèque tierce pour résoudre ces liens et intégrer les données résultantes à la place?

Toute entrée sur cette?

Merci d'avance!

29
demandé sur Rolf 2013-04-21 05:42:38

5 réponses

Caisse angulaires-hateoas. C'est un module AngularJS pour utiliser $resource avec une API REST activée par HATEOAS.

20
répondu Farm 2014-04-01 02:18:33

Vous pouvez écrire une Transformation de réponse qui inspecterait votre objet retourné, vérifierait les liens et les résoudrait avant de renvoyer la réponse. Voir la section "transformation des requêtes et des réponses" dans la documentation du service $http .

Quelque Chose comme ceci:

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

Puisque l'étape "resolve link" est elle - même un appel $http, les sous-Références seraient également résolues. Cependant, comme ceux-ci sont asynchrones, vous retournerez 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 l'a souligné @charlietfl, notez cependant que cela entraînera plusieurs appels HTTP Pour renvoyer une seule entité. Même si j'aime le concept de HATEOAS, cela entraînera probablement une lenteur si trop d'appels sont faits. Je suggère que votre serveur renvoie les données, ou certaines d'entre elles, directement, PLUS le lien pour plus de détails.

7
répondu st.never 2013-04-22 06:49:53

Sur la base de votre commentaire sur le fait de vouloir travailler avec des données par rapport aux liens sur le client, je pense que Restangular serait un bon ajustement.

2
répondu Pankaj Tandon 2013-07-30 19:59:29

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

1
répondu user3408654 2014-10-16 23:15:38

Je pense que la confusion peut être que vous demandez une solution angulaire, quand ce que vous voulez vraiment faire est que Spring Data envoie une réponse JSON plus complète. C'est-à-dire que vous voulez vraiment que le serveur renvoie les données de l'employé dans le cadre de la réponse JSON, plutôt que d'avoir le client effectuer des étapes 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 la méthode publique getemployee () à votre classe D'activité, puis d'annoter la méthode avec @RelatedTo et @Fetch (ce serait la configuration pour Neo4J - peut être des annotations différentes pour votre saveur de données Spring). Cela devrait amener Spring HATEOAS à inclure le dossier de L'employé dans la réponse pour /activité. Espérons que cette aide.

0
répondu Adam Policky 2015-10-16 12:04:17