Подтвердить что ты не робот

Клиент HATEOAS с AngularJS

Мне было интересно, есть ли какие-либо функции, скрытые в Angular или открытые некоторыми сторонними библиотеками, чтобы легко создавать постоянные клиенты, поддерживающие HATEOAS.

На стороне сервера я использую Spring Data/REST для создания API HESTOAS JSON. Потребоваться это, правда, совсем другая история.

Например, у меня есть эти 3 объекта:

  • Компания {name, address}
  • Сотрудник {firstName, lastName, employer[Company]}
  • Деятельность {rate, day, employee[Employee], client[Company]}

и запрос активности (самый сложный объект модели) создает что-то вроде этого:

{
    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"
            }]
        }]
}

Мой API говорит в терминах REST (ресурсы, идентифицированные ссылками). Например, у Activity есть Сотрудник. Я действительно хочу использовать: {rate: 456, day: 1366754400000, employee: {firstName:"xxx", lastName:"xxx" ...}}.

Однако, как вы можете видеть в первом выпуске, моя активность содержит только ссылку на сотрудника, а не его данные. Есть ли что-нибудь в Angular или в сторонней библиотеке для разрешения этих ссылок и вместо этого вставлять результирующие данные?

Любой ввод на этом?

Спасибо заранее!

4b9b3361

Ответ 1

Оформить заказ angular-hateoas. ITs - модуль AngularJS для использования $resource с API-интерфейсом REST с поддержкой HATEOAS.

Ответ 2

Вы можете написать "Преобразование ответов", которое будет проверять возвращаемый объект, проверять ссылки и разрешать их, прежде чем возвращать ответ. См. Раздел "Преобразование запросов и ответов" в $http service documentation.

Что-то вроде этого:

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

Поскольку шаг "ссылка на ссылку" сам является вызовом $http, субреференции также будут разрешены. ОДНАКО, поскольку они асинхронны, вы скорее всего вернете обещание вместо реальной стоимости; Я не знаю, разрешена ли функция преобразования.

Однако, как отметил @charlietfl, обратите внимание, что это приведет к нескольким HTTP-вызовам для возврата одного объекта. Хотя мне нравится концепция HATEOAS, это, вероятно, приведет к медлительности, если будет сделано слишком много вызовов. Я бы предположил, что ваш сервер вернет данные, или некоторые из них, прямо, PLUS ссылку для деталей.

Ответ 3

Основываясь на вашем комментарии о желании работать с данными по отношению к ссылкам на клиенте, я думаю, что Restangular будет хорошо подходить.

Ответ 4

Я использовал angular-hal для одного из моих проектов. Это был бэкэнд Spring HATEOAS. И у меня не возникало проблем. Он обрабатывает параметризованные ресурсы. Я подозреваю, что он поддерживает только HAL, так как вы используете Spring Data Rest, вам, вероятно, придется настроить его для генерации ответов, совместимых с HAL.

Ответ 5

Я думаю, что путаница может заключаться в том, что вы запрашиваете решение Angular, когда то, что вы действительно хотите сделать, - это Spring Data отправить более полный ответ JSON. I.e, вы действительно просто хотите, чтобы сервер возвращал данные сотрудника как часть ответа JSON, вместо того, чтобы клиент выполнял дополнительные шаги для его поиска. Я не знаю, какое хранилище данных вы используете в Spring Data, но общим решением было бы добавить открытый метод getEmployee() в ваш класс Activity, а затем аннотировать метод с помощью @RelatedTo и @Fetch (это будет для Neo4J - могут быть разные аннотации для вашего аромата Spring Data). Это должно заставить Spring HATEOAS включить запись Employee в ответ на/действие. Надеюсь это поможет.