c# - net - Generando enlaces de hipermedia en una API web
web api con sql server (4)
Al responder a esta pregunta, es instructivo mirar hacia el enfoque de ASP.NET MVC para manejar esto, ya que ASP.NET MVC puede verse como una versión restringida de texto / html de la API web (a pesar de la negociación de contenido manual), y como es obvio fuertemente influido en el diseño de la API web.
Básicamente, podemos usar formateadores personalizados para variar las representaciones según la ruta o un atributo de acción. Esto se informa por la forma en que ASP.NET MVC separa las vistas de los modelos. En un proyecto MVC de ASP.NET, un modelo único puede representarse mediante varias plantillas de vista. Cada una de estas plantillas de vista son esencialmente enlaces de transición de "códigos duros" (elementos de ancla, forma y enlace) en esa representación particular del modelo. La selección de la plantilla de vista se basa principalmente en la convención (controlador y nombre de la acción), pero también puede ser codificada en la acción.
El motor de visualización y la convención de búsqueda de visualización en ASP.NET MVC pueden considerarse un formateador de API web personalizado. Esto se puede generalizar de tal manera que, para cada tipo de medio compatible, un formateador personalizado utiliza los detalles de la ruta y, opcionalmente, un atributo aplicado al método de acción invocado, para definir el estado del recurso. (Bajo esta convención, hay beneficios al elegir nombres de acciones que reflejen el estado del recurso). Una vez que el formateador conoce el estado del recurso, puede delegar a un código de formato específico del estado. En este código es donde se definirían los enlaces específicos del estado.
Este código de formato específico del estado también podría delegar a otros subformateadores, de la misma manera que las vistas de Razor admiten la composición de vistas parciales.
Tengo curiosidad por saber cómo otros han tratado el tema de generar enlaces de hipermedia para sus API web. Específicamente, estoy usando la API web de ASP.NET, y estoy dividido entre hacer que las operaciones devuelvan los tipos relacionados con hipermedia, o devolver el recurso en sí, y que las cosas de hipermedia ocurran más adelante. Es decir, la gente tiende a hacer cosas como:
public Resource<Order> GetOrder(int id) {
return new Resource<Order>() {
Content = new Order(),
Links = new LinkCollection<Order>() { new AddOrderLink(), new UpdateOrderLink()}
}
O algo mas como
public Order GetOrder(int id) { return new Order(); }
¿Y luego agregar enlaces de hipermedia dentro de un HttpOperationHandler o un formateador personalizado o algo así?
Si el enfoque es más parecido al # 2, ¿cómo sabe qué enlaces generar? ¿Solo tienes un conjunto estándar de enlaces que se generan para todos los objetos de Orden? ¿Atributos decorando diversas operaciones en OrdersController?
He agregado mi solución here
Utiliza atributos de clase y propiedad en combinación con un método de extensión ApiController para completar un objeto ResourceLink en su entidad. También puede rellenar enlaces para cualquier propiedad de colección. No es el artículo terminado, pero es bastante intuitivo y será un buen comienzo.
Prefiero la opción dos (agregar los enlaces de hipermedia más adelante en el canal) y escribí en el blog sobre esto ayer .
La solución fue "enriquecer" mis recursos con enlaces de hipermedia antes de devolverlos al cliente utilizando un controlador de mensajes.
Puedes usar el Hyprlinkr desde github
Estoy planeando usarlo en mi próximo proyecto, ya que parece ser agradable y fácil de hacer y puedes obtenerlo a través del paquete nuget.