2009-07-24 11 views
17

¿Alguien sabe de una implementación de un cliente REST que incluye la restricción de Hypermedia as the Engine of Application State (HATEOAS)?REST Implementación del cliente Abrazar la restricción de HATEOAS?

El Sun Cloud API parece ser un buen candidato, a juzgar por la forma en que está documentado y a statement by the author en el sentido de que las implementaciones de Ruby, Java y Python estaban en proceso. Pero hasta ahora no he encontrado rastro del código.

Estoy buscando algo, incluso una implementación parcial sería útil.

+0

Buena pregunta. Tampoco he encontrado marcos para escribir clientes RESTful: IE aquellos que pueden reaccionar dinámicamente siguiendo el principio HATEOAS. Es una pena porque esta idea es un principio del REST, pero la falta de apoyo formal, así como una gran cantidad de malentendidos sobre el REST en general, hace que la comunidad se vea fragmentada. – jkp

+0

@DawidFerenczy está fuera de tema por las mismas razones que aquí. Por favor, abstente de recomendar sitios con los que no estés familiarizado. Lectura recomendada: ** [¿Qué pasa en Ingeniería de Software (anteriormente conocido como Programadores)? Una guía para Stack Overflow] (https://softwareengineering.meta.stackexchange.com/q/7182/31260) ** – gnat

Respuesta

1

El principio de diseño de HATEOAS (REST también es un conjunto de principios de diseño) significa que cada recurso debe tener como máximo una sola URL fija.

Todo lo demás relacionado debe ser reconocible dinámicamente desde esa URL a través de enlaces "hipermedia".

simplemente empecé un stub Wikipedia here

+0

El resto es una "arquitectura". – aehlke

+0

Creo que esta respuesta y su código de Wikipedia son incorrectos. No veo cómo ni por qué una URL * simple * debe acceder a una aplicación REST. Cualquier URL dada debería ser marcable (los URI geniales no cambian) y no veo cómo tiene sentido "a lo sumo una única URL fija". Eso implica que hay recursos que no tienen una URL? Obviamente no. No veo por qué un recurso tampoco puede tener múltiples URI. HATEOAS significa que las transiciones de estado se realizan a través de enlaces hipermedia. Eso incluye pasar de una copia de seguridad profunda a un recurso superior. –

+0

El principio HATEOS es en realidad uno en el que el URI no es fijo, ese es el punto. Desacoplar las suposiciones de la URL del cliente de la implementación real de los servidores. – Jammer

6

Restfulie es una infraestructura Ruby #, Java y C, que tiene por objeto permitir la construcción de los clientes y servidores que emplean HATEOAS. No lo he usado, pero se ve interesante.

Aquí hay un código de ejemplo de their java project:

Order order = new Order(); 

// place the order 
order = service("http://www.caelum.com.br/order").post(order); 

// cancels it 
resource(order).getTransition("cancel").execute(); 

Una vez más, no estoy seguro exactamente lo que esto hace, o lo bien que funciona en la práctica, pero sí parece intrigante.

0

Rich,

estoy trabajando en un marco de cliente de descanso para Jersey en este momento. Una vez que el diseño inicial se estabilice un poco, se agregará a la base del código de Jersey y, después de pasar por la comunidad para su revisión, finalmente debería tener la forma del marco del lado del cliente de JAX-RS.

Ha habido una animada discusión en la lista de usuarios de Jersey recientemente sobre todo lo RESTful. https://jersey.dev.java.net/servlets/SummarizeList?listName=users

En un plazo de dos semanas, el código se hará público la primera vez que la gente experimente.

Ene

+0

alguna noticia sobre eso? – koppor

+0

No, el enfoque lo hizo en 2010, desafortunadamente. Lo siento. –

+0

¿Las nuevas anotaciones @Ref y la nueva clase Link no funcionan? http://jersey.java.net/nonav/documentation/latest/user-guide.html#d0e7556 – koppor

2

El problema con REST HTTP y HATEOAS es que no existe un enfoque común para la especificación de enlaces por lo que es difícil de seguir enlaces, ya que su estructura puede cambiar de un proveedor de servicio a otro. Algunos usarían <link href="..." /> otros usarían la estructura propietaria para de enlaces ex. <book href="..." />. No es como en HTML o átomo donde el enlace es parte de un estándar definido.

Un cliente no puede saber lo que es un enlace en su representación es que no sabe el tipo de material a menos que haya una representación estándar o convencional de un enlace

12

La primera cosa que usted debe mirar es el navegador web común. Es el estándar para un cliente que adopta HATEOAS (al menos hasta cierto punto).

Así es como funciona Hypermedia.Es tan simple que es casi doloroso:

  1. apunta su navegador a http://pigs-are-cool.org/
  2. el navegador carga la página HTML, imágenes, CSS y así sucesivamente.
    • En este punto, la aplicación (su experiencia de navegación) está en un URI específico.
    • El navegador está mostrando el contenido de ese URI
  3. ves un enlace en la aplicación
  4. hacer clic en el enlace
  5. el navegador sigue el enlace
    • en este punto, la la aplicación está en un URI diferente
    • El navegador muestra el contenido del nuevo URI

Ahora, para una breve explicación de cómo los dos términos se refieren a la experiencia de navegación web:

  • Hipermedia = páginas HTML con los enlaces incorporados
  • estado de la aplicación = Lo que están viendo en el navegador en cualquier punto en el tiempo.

Así HATEOAS describe realmente lo que sucede en un navegador web cuando se pasa de la página web a la página web:

páginas HTML con enlaces incorporados unidad lo que se ve en el navegador en cualquier punto time

El término HATEOAS es solo una abstracción de esta experiencia de navegación.

Otros ejemplos de aplicaciones de cliente REST incluyen:

  • RSS y alimentar a los lectores. Atraviesan los enlaces que les dan los usuarios
  • La mayoría de los clientes del blog AtomPub. Necesitan simplemente un URI para un documento de servicios, y a partir de allí descubren dónde subir imágenes y publicaciones de blogs, buscar, etc.
  • Probablemente Google Gadgets (y similares), pero no son más que navegadores con una apariencia diferente.
  • Los rastreadores web también son clientes RESTful, pero son un nicho de mercado.

Algunas características del software de cliente REST:

  • El cliente trabaja con con cualquier servidor, dado que se ceba con un poco de URI y el servidor responde con un resultado esperado (por ejemplo, para un cliente de blog de átomo , un documento de servicios de Atom).
  • El cliente no sabe nada sobre cómo el servidor diseña sus URI distintas de lo que puede averiguar en tiempo de ejecución
  • El cliente sabe lo suficiente como tipos de medios y rel de entender lo que el servidor está diciendo (por ejemplo, Atom o RSS)
  • El cliente usa enlaces incrustados para buscar otros recursos; algunos de forma automática (como <img src=) algunos de forma manual (como <a href=).

Muy a menudo son manejadas por un usuario y pueden denominarse correctamente "agentes de usuario", excepto, digamos, GoogleBot.

+1

Eso es todo muy bueno, pero un navegador web simplemente representa los hipermedios, es un humano que hace toda la comprensión y decide qué enlaces significa y en qué cosas hacer clic. ¿Qué pasa con la implementación de un cliente diseñado para ser impulsado por software? –

+0

Esa es absolutamente la gran diferencia. Una implementación de cliente impulsada por software necesita ser programada para comprender los enlaces (y formularios?) Que encuentra en sus "aventuras". El punto principal es, supongo, codificar un cliente para los tipos de medios, y no para la estructura de URI de un servidor en particular. – mogsie

+1

Es interesante que todos sus "otros ejemplos" sean clientes que recuperan datos y los presentan para que los lea un ser humano. HATEOS funciona muy bien en el servidor para exponer cosas en un formato lógico, pero en el lado del cliente, no puedo ver lo que ofrece sobre RPC. Acabo de codificar el nombre de los enlaces que me interesan, en lugar de codificar la estructura de la URL de esos enlaces. ¿Cómo me ayuda el tipo de medios? No sé el tipo de medio hasta que recupere el enlace. –

0

Spring Framework's RestTemplate se puede utilizar para lograr el propósito. Compruebe esto article para más detalles.

Cuestiones relacionadas