2012-09-05 14 views
19

Tengo curiosidad por saber cómo otros han tratado el tema de la generación de hipermedia enlaces para sus API web? Específicamente, estoy usando ASP.NET Web API, y estoy dividido entre hacer que las operaciones devuelvan tipos relacionados con hipermedia, o devolver el recurso en sí, y que el material hipermedia ocurra más adelante en la tubería. Es decir, ¿la gente tiende a hacer cosas como:Generar hipermedia enlaces en una API web

public Resource<Order> GetOrder(int id) { 
    return new Resource<Order>() { 
     Content = new Order(), 
     Links = new LinkCollection<Order>() { new AddOrderLink(), new UpdateOrderLink()} 
    } 

O algo más como

public Order GetOrder(int id) { return new Order(); } 

Y a continuación, añadir enlaces hipermedia dentro de un formateador HttpOperationHandler o costumbre o algo?

Si el enfoque es más parecido al # 2, ¿cómo sabe qué enlaces generar? ¿Solo tiene algún conjunto estándar de enlaces que se generan para todos los objetos Order? ¿Atributos que decoran varias operaciones en OrdersController?

+0

Adición: He leído la publicación de Glenn Block sobre hipermedia en Web API (http://codebetter.com/glennblock/2012/01/08/hypermedia-and-web-api-design-brain-dump-and -samples /) y si bien parece favorecer la generación de enlaces en operación (similar al ejemplo 1 anterior), siento que la ruta de "middleware" que menciona hacia el final se siente más natural. – Jordan0Day

+1

mira la presentación de ammy en newzealand teched http://channel9.msdn.com/Events/TechEd/NewZealand/2013/DEV305 su solución es prometedora para hypermedia con API web también mira aquí github código de ejemplo – Gomes

Respuesta

24

Prefiero la opción dos (agregando los hipermedia enlaces más adelante en la tubería) y blogged about doing this yesterday.

La solución fue "enriquecer" mis recursos con hipermedia enlaces antes de que se devuelvan al cliente utilizando un controlador de mensajes.

+0

Esto es genial, gracias por compartir. Usamos métodos de extensión y fue más un código de cookie que representó 1 línea de código en el método de acción. Me gusta que haya devuelto el recurso y puede agregar o no agregar hipermedia según el contexto. – suing

9

Puede utilizar el Hyprlinkr de github

tengo la intención de usarlo en mi próximo proyecto, ya que seens de ser agradable y fácil de hacerlo y lo puede conseguir a través de paquete Nuget.

+3

So Hyprlinkr es un una buena solución para generar enlaces, cuando sabe qué enlaces quiere generar. Mi pregunta fue más sobre "cómo sé qué enlaces necesito generar", en lugar de "¿cómo debería generarlos?" De cualquier manera, Hyperlinkr ayuda a resolver el problema una vez que llegas a la parte de "cómo". – Jordan0Day

2

Para responder a esta pregunta, es instructivo mirar hacia el enfoque de ASP.NET MVC para el manejo de este, ya que ASP.NET MVC puede ser visto como un texto/versión de la API de Web HTML con limitaciones (a pesar de la negociación de contenido Manual), y dado que obviamente influyó mucho en el diseño de la API web.

Básicamente, podemos usar formateadores personalizados para variar las representaciones basadas en 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 ASP.NET MVC, varias plantillas de vistas pueden representar un único modelo. Cada una de estas plantillas de vista esencialmente enlaces "duros" de transición (ancla, forma y elementos de enlace) en esa representación particular del modelo. La selección de la plantilla de vista se maneja predominantemente por convención (controlador y nombre de acción), pero también puede codificarse en la acción.

El motor de vista y la convención de búsqueda en ASP.NET MVC se pueden considerar un formateador de API Web personalizado. Esto se puede generalizar de forma tal que, para cada tipo de medio admitido, un formateador personalizado utilice detalles de ruta, y opcionalmente un atributo aplicado al método de acción invocado, para definir el estado del recurso. (Según esta convención, se obtienen beneficios al elegir los nombres de las acciones que reflejan el estado del recurso). Una vez que el formateador conoce el estado del recurso, puede delegar en el 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 subformatters, de la misma manera que las vistas de Razor admiten la composición de vistas parciales.

1

he añadido mi solución here

Utiliza clase y los atributos de la propiedad en combinación con un método de extensión ApiController para rellenar un objeto ResourceLink en su entidad. También puede llenar enlaces para cualquier propiedad de colección. No es el artículo terminado, pero es bastante intuitivo y hará un buen comienzo.

Cuestiones relacionadas