2010-07-14 13 views
11

Se dice que en un sistema RESTful bien definido, los clientes solo necesitan conocer el URI raíz o algunos pocos URI conocidos y el cliente descubrirá todos los demás enlaces a través de estos URI iniciales. Hago entender los beneficios (clientes desconectados) de este enfoque, pero el inconveniente para mí es que el cliente necesita para descubrir los vínculos cada vez que intenta acceder a algo es decir, teniendo en cuenta la siguiente jerarquía de los recursos:Connectedness & HATEOAS

/collection1 
collection1 
    |-sub1 
    |-sub1sub1 
|-sub1sub1sub1 
     |-sub1sub1sub1sub1 
    |-sub1sub2 
    |-sub2 
    |-sub2sub1 
    |-sub2sub2 
    |-sub3 
    |-sub3sub1 
    |-sub3sub2 

Si seguimos el cliente "solo necesita conocer el URI raíz", entonces un cliente solo debe conocer el URI raíz ie/collection1 anterior y el resto de los URI deben ser descubiertos por los clientes a través de hipermedia links. Me resulta engorroso porque cada vez que un cliente necesita hacer un GET, por ejemplo en sub1sub1sub1sub1, el cliente primero debe hacer un GET on/collection1 y el siguiente enlace definido en la representación devuelta y luego hacer varios GET adicionales en los sub recursos para alcanzar el recurso deseado? o es mi comprensión sobre la conexión completamente incorrecta?

Saludos, Suresh

+0

El servicio REST es apátrida, el cliente no lo es. Entonces el cliente puede recordar los recursos previos, sus URL-s, etc., por ejemplo, mediante un menú de navegación anidado ... – inf3rno

Respuesta

6

Se encontrará con esta discrepancia cuando intente crear una API REST que no coincida con el flujo del agente de usuario que está consumiendo la API.

Considere cuando ejecuta una aplicación cliente, siempre se le presenta al usuario alguna pantalla inicial. Si combina el contenido y las opciones en esta pantalla con la representación raíz, los enlaces disponibles y las transiciones deseadas coincidirán muy bien. A medida que el usuario selecciona las opciones en la pantalla, puede hacer la transición a otras representaciones y la IU del cliente debe actualizarse para reflejar la nueva representación.

Si intenta modelar su REST API como un tipo de repositorio de datos vinculado y su UI de cliente como un conjunto independiente de transiciones, entonces encontrará HATEOAS bastante doloroso.

+0

doloroso no es necesariamente cierto: tengo esto, una jerarquía de colecciones de artículos, y el cliente, cuando comienza, profundiza uno o dos niveles, y profundiza en una ruta específica (la ruta que utilizó el cliente) tener cuando se apaga). La memoria caché del cliente es persistente, por lo que todas las solicitudes son condicionales, y muy rara vez las nuevas representaciones pasan por el cable, y la actualización se puede realizar de forma asincrónica en segundo plano trabajando completamente fuera de la memoria caché. – mogsie

+0

y estoy de acuerdo en que modelar la "API" como requisitos de la aplicación cliente hace que la sesión sea efectiva, pero supongo que el punto es que a menudo una API debe atender a muchos clientes, no solo a ese cliente. – mogsie

+0

@mogsie En muchos casos, es posible crear una API para varios clientes, sin embargo, creo que en la mayoría de los casos es mucho más eficiente crear una API para un caso específico. La reutilización fortuita es lo que el REST pretende proporcionar, no necesariamente la reutilización planificada. –

0

no creo que ese es el requisito estricto. Por lo que entiendo, es legal que un cliente acceda a los recursos directamente y comience desde allí. Lo importante es que no haga esto para las transiciones de estado, es decir, no proceda automáticamente con/foo2 después de operar en/foo1, etc. Recuperando/products/1234 inicialmente para editar parece perfectamente bien. El servidor siempre puede devolver, por ejemplo, una redirección a/shop/products/1234 para seguir siendo compatible con versiones anteriores (lo cual es deseable para los motores de búsqueda, los marcadores y los enlaces externos también).

4

Sí, es correcto que la aplicación cliente atraviese los enlaces, pero una vez que se descubre un recurso, no hay nada de malo en mantener una referencia a ese recurso y usarlo durante más tiempo que una solicitud. Si su cliente tiene la posibilidad de recordar cosas permanentemente, puede hacerlo.

considere cómo un navegador web mantiene sus marcadores. Probablemente tengas quizás diez o cien marcadores en el navegador, y probablemente encuentres algunos de ellos en una jerarquía de páginas, pero el navegador los recuerda diligentemente sin necesidad de recordar el camino que tomó encontrarlos.

Una aplicación cliente más completa podría recordar el URI de sub1sub1sub1sub1 y volver a utilizarlo si aún funciona. Es probable que todavía represente lo mismo (debería). Si ya no existe o falla por algún otro motivo del cliente (4xx) puede volver sobre sus pasos para ver si puede encontrar un reemplazo adecuado.

Y, por supuesto, lo que Darrel Miller dijo :-)

+1

Me gusta su analogía aquí. Existe la idea de que todo está vinculado entre sí y que lo que no está vinculado no puede ser alcanzado. En ese sentido, Google se convirtió en la raíz de todas las navegaciones, pero las personas guardan atajos (marcadores) todo el tiempo. Sin embargo, si no estás en Google, básicamente no existes. – Alex

+0

Gracias. O, para ser más precisos: si Google no tiene una ruta a una página, no existe. Algo así como el enigma: "Si un árbol cae en un bosque y nadie está allí para escucharlo, ¿hace algún ruido?" – mogsie