WCF Data Services (OData) Vs ASP.NET Web API? Hipermedia?

12

Estoy diseñando una aplicación distribuida que consistirá en servicios REST y una variedad de clientes (Silverlight, iOS, Windows Phone 7, etc.). Estaba listo para decidir que implementaría mis servicios REST utilizando WCF Data Services (OData), pero ahora la MVC 4 Web API me ha hecho cuestionar esa decisión.

Lo que me gustó de OData fueron las consultas de URI y las capacidades de hipermedia que obtienes de forma gratuita. Lo que no me gustó fue la verbosidad de la carga útil de OData; muchos caracteres innecesarios que pasan por el cable.

Lo que me gusta de la API web es que las cargas útiles son mucho más concisas y tiene la capacidad de consulta de URI de OData, sin embargo, parece que carece de hipermedia (al menos desde el primer momento). Mi jefe también está presionando por la API web porque "los poderes que están en Microsoft la respaldan y OData no ha estado ganando terreno".

Entonces tengo dos preguntas:

1) ¿Alguien puede comentar sobre el respaldo / tracción de la API web y OData?

2) ¿Se espera que la API web admita de forma nativa hipermedia en el momento del lanzamiento o hay implementaciones o ejemplos disponibles que debería analizar?

¡Gracias!

Raymond Saltrelli
fuente
2
Buenas respuestas para la pregunta 1 hasta ahora. ¿Alguien tiene alguna idea de mi segunda pregunta?
Raymond Saltrelli
Un poco me perdí eso, y he visto el término, pero no estoy seguro de qué hipermedia es en un sentido técnico: ¿tiene un enlace?
Wyatt Barnett
2
Básicamente, hipermedia en el contexto de REST significa "carga diferida". Por ejemplo, si su solicitud a un servicio REST devuelve un objeto que tiene una referencia a otro objeto, esas referencias se representan como un enlace en el documento XML en lugar de incluir el objeto referenciado en su totalidad. Si desea información sobre el objeto referenciado, simplemente siga el enlace. dret.net/lectures/ppos-spring11/reading/…
Raymond Saltrelli
1
Otra buena descripción de hipermedia con respecto a REST. timelessrepo.com/haters-gonna-hateoas
Raymond Saltrelli

Respuestas:

2

API web hace odata. Ver la publicación del blog de Scott Guthrie . Específicamente:

Composición de la consulta: la API web le permite admitir fácilmente las consultas a través de las convenciones de URL de OData. Cuando devuelve un tipo de IQueryable desde su API web, el marco proporcionará automáticamente soporte de consultas OData sobre él, lo que facilita la implementación de paginación y clasificación.

También creo que, en muchos casos, la misma clase podría ser la clase WCF tradicional y la clase API web, definitivamente no son mutuamente excluyentes.

Wyatt Barnett
fuente
2

La API web aprovecha el protocolo http de forma más nativa. Odata es un estándar abierto aceptado por muchos de los grandes jugadores. Solo puedo hablar desde mi experiencia jugando con Odata, y recientemente descubriendo API web e investigando un poco.

OData es genial porque es un estándar real. Puede crear fácilmente una base de datos y exponerla a través de HTTP. Esto significa que puede atravesar la estructura de su tabla sin ninguna configuración (lo digo libremente). También puede ejecutar consultas a través de la URL que puede incluir algo de LINQ ligero:

/products/orders/[put some linq-ish query here]

Esto es posiblemente bueno o malo. La autenticación es estándar y la construyó.

API web, es más interesante desde mi perspectiva. Utilizó la funcionalidad HTTP (mensajes de error, et al.) Y es un poco más "nativo" que las solicitudes RESTful verdaderas. Realmente no he jugado demasiado con eso ... Pero he leído y he "escuchado" que MVC y Web API pueden estar "casados" algún día, de nuevo, tal vez bueno tal vez malo ...

Cuando estaba jugando con OData, creé un proceso almacenado, lo asigné a la superficie de la entidad, configuré un tipo de retorno fuerte y luego lo conecté a una solicitud de URL y BANG, ahí está mi solicitud RESTful asignada a mi proceso almacenado de resultados escritos. Fue bastante sencillo y pude obtener exactamente lo que necesitaba.

En conclusión, no he tenido la oportunidad de jugar con WCF API con demasiados detalles, pero diría que es el camino a seguir para el desarrollo del cliente, ya que es más un enfoque purista para REST. Si va a hacer más o menos llamadas "directas" de ida y vuelta y recuperar "Ver modelos", proporcionará una interacción más nativa.

Por otra parte. Si va a realizar consultas complejas (ish) sobre los datos en función de la interacción con el cliente y desea "construir" la lógica de consulta y pasarla como parámetro, entonces Odata podría funcionar.

La forma en que lo veo es si necesito exponer mis datos en un formato estructural (que significa estructura de tabla / relación) y luego consultarlo directamente desde un cliente, entonces Odata funcionará mejor. También es bueno para permitir que "Otros" accedan a los datos (con la autenticación adecuada, etc.), por lo que se adhiere al protocolo OData

Si desea solicitudes RESTful donde dicta la URL (/ productos / pedidos / 22 y crea complejos "conjuntos de resultados" a partir de su código administrado "oculto" y estructura de datos Y también puede beneficiarse de los mensajes de respuesta HTTP, entonces el La API web probablemente sería la mejor apuesta.

De nuevo, esto es todo de la investigación y el juego. Tampoco lo he implementado en un escenario de producción / aplicación completa. Creo que ambos tendrán sus fortalezas y debilidades, y definitivamente hay cierta superposición

hanzolo
fuente
2

Desde el punto de vista hipermedia definitivamente Web API. OData, que se basa en AtomPub, es solo una forma de exponer una base de datos utilizando HTTP, solo obtiene un conjunto limitado de transferencias de estado predefinidas (CRUD). Por otro lado, un servicio de hipermedia es como una aplicación, diseñada para el cliente. Con Web API puede incrustar todos los enlaces que desee, además de usar la sintaxis de consulta OData. En realidad, la mejor solución de hipermedia en la pila de Microsoft es ASP.NET MVC, si está dispuesto a usar HTML como formato base.

Max Toro
fuente
2
¿Hay ejemplos en línea de cómo implementar esto usando la API web?
Raymond Saltrelli
¿todavía apoya esta opinión con la adición de acciones en odata v3 ( odata.org/media/30002/OData.html#actions )?
Chris DaMour