example - spring boot rest api angular
Cliente HATEOAS con AngularJS (5)
Basado en su comentario acerca de querer trabajar con datos en comparación con los enlaces en el cliente, creo que Restangular sería una buena Restangular .
Me preguntaba si había algunas características ocultas en Angular o expuestas por algunas bibliotecas de terceros para crear fácilmente clientes Restful compatibles con HATEOAS.
En el backend, estoy usando Spring Data / REST para producir una API JSON de HATEOAS. Sin embargo, consumirlo es otra historia.
Por ejemplo, tengo esas 3 entidades:
- Empresa
{name, address}
- Empleado
{firstName, lastName, employer[Company]}
- Actividad
{rate, day, employee[Employee], client[Company]}
y solicitar una actividad (la entidad más compleja del modelo) produce algo como esto:
{
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"
}]
}]
}
Mi API habla en términos de REST (recursos identificados por enlaces). Una actividad tiene un empleado, por ejemplo. Lo que realmente quiero usar es: {rate: 456, day: 1366754400000, employee: {firstName:"xxx", lastName:"xxx" ...}}
.
Sin embargo, como puede ver en la primera salida, mi actividad solo contiene un enlace al empleado, no sus datos. ¿Hay algo en Angular o en una biblioteca de terceros para resolver esos enlaces e incrustar los datos resultantes?
¿Alguna entrada en esto?
¡Gracias por adelantado!
Creo que la confusión puede ser que estás pidiendo una solución angular, cuando lo que realmente quieres hacer es que Spring Data envíe una respuesta JSON más completa. Es decir, realmente solo desea que el servidor devuelva los datos del empleado como parte de la respuesta JSON, en lugar de que el cliente realice pasos adicionales para buscarlos. No sé qué almacén de datos está utilizando en Spring Data, pero la solución general sería agregar el método público getEmployee () a su clase de Actividad y luego anotar el método con @RelatedTo y @Fetch (esta sería la configuración para Neo4J - pueden ser diferentes anotaciones para su sabor de Spring Data). Esto debería hacer que Spring HATEOAS incluya el registro de Empleado dentro de la respuesta para / actividad. Espero que esto ayude.
He estado usando angular-hal para uno de mis proyectos. Fue un backend HATEOAS de primavera. Y no me encontré con ningún problema. Maneja recursos parametrizados. Sospecho que solo es compatible con HAL, por lo que, dado que está utilizando Spring Data Rest, probablemente tenga que configurarlo para generar respuestas compatibles con HAL.
Puede escribir una Transformación de respuesta que inspeccione su objeto devuelto, verifique los enlaces y los resuelva antes de devolver la respuesta. Consulte la sección "Transformación de solicitudes y respuestas" en la documentación del servicio $ http .
Algo como esto:
transformResponse: function(rawData) {
var json = JSON.parse( rawData );
forEach( json.content.links, function(link) {
// resolve link...
});
return json;
}
Dado que el paso "resolver enlace" es en sí mismo una llamada $ http, las subreferencias también se resolverían. SIN EMBARGO, ya que estos son asíncronos, es probable que devuelva una promesa en lugar del valor real; No sé si la función de transformación está permitida para hacer esto.
Sin embargo, como señaló @charlietfl, tenga en cuenta que esto dará lugar a varias llamadas HTTP para devolver una sola entidad. Aunque me gusta el concepto de HATEOAS, esto probablemente resultará en lentitud si se hacen demasiadas llamadas. Sugeriría que su servidor devuelva los datos, o parte de ellos, directamente, MÁS el enlace para obtener más detalles.
angular-hateoas . Es un módulo AngularJS para usar $ resource con una API REST habilitada por HATEOAS.