una sirve servicios qué que para nodejs ejemplo xml rest web-services hateoas

xml - sirve - ¿Vale la pena lograr HATEOAS para servicios web de descanso en el uso en el mundo real?



servicios web rest (4)

Esto no es realmente una respuesta, solo algunos consejos para adoptar HATEOAS. No necesita incluir cientos de enlaces, puede incluir 1 enlace a la lista completa de 500, 1 enlace a un subconjunto paginado de los enlaces, o incluir un subconjunto paginado en la respuesta y agregar el enlace de la página siguiente.

En respuesta a la cuestión de WADL, debe usar las facilidades integradas de cualquier formato de contenido, por ejemplo, en HTML que sería LINK y los elementos A para indicar que el cliente debe realizar solicitudes GET y elementos FORM para las solicitudes POST. Obviamente, otros formatos y APIs XLink y XMLHTTPRequest admiten HTTP mejor que HTML. Es posible que http://tools.ietf.org/html/draft-nottingham-link-hint consultar http://tools.ietf.org/html/draft-nottingham-link-hint

He estado leyendo mucho sobre los beneficios potenciales si tuviera que convertir mis servicios web Restful existentes para ser lo más HATEOS posible. Entiendo la importancia de proporcionar enlaces en la carga útil para reducir la carga del consumidor al recordar las siguientes acciones válidas disponibles. Sin embargo, parece que no puedo comprender cómo ayudará a los consumidores de mis servicios web Restful en realidad.

Para ilustrar, tomo este ejemplo del libro Rest In Practice sobre cómo hacer un pedido de café:

<order xmlns="http://schemas.restbucks.com"> <location>takeAway</location> <item> <name>latte</name> <quantity>1</quantity> <milk>whole</milk> <size>small</size> </item> <cost>2.0</cost> <status>payment-expected</status> <link rel="payment" href="https://restbucks.com/payment/1234" /> </order>

Básicamente, esto permite que el consumidor realice un pago definido por la etiqueta <link> . Sin embargo, en realidad, el consumidor todavía necesita saber toda la semántica de esa llamada de servicio web, por ejemplo, qué método (POST o PUT) usar, qué parámetros de solicitud usar en la carga útil para realizar el pago, etc. .. en otras palabras, el consumidor todavía necesita confiar en la documentación de WADL para saber cómo hacer que este servicio web se invoque con éxito. Es probable que estas etiquetas tengan más sentido si todas utilizan GET en un elemento específico. De lo contrario, realmente no veo muchos beneficios en la definición de los enlaces aquí ... aparte del hecho de que el consumidor sabe qué acciones pueden invocar a continuación, y luego consulte el WADL para determinar cómo invocarlo correctamente.

Mi siguiente preocupación es la posibilidad de terminar con una carga muy pesada con todas las etiquetas <link> . Por ejemplo, si un GET en / projects / 1 / users devuelve toda la información del usuario que pertenece al proyecto 1, asumo que terminaré con las siguientes etiquetas:

<project> <users> <user id="12" name="mike" ... /> <user id="23" name="kurt" ... /> <user id="65" name="corey" ... /> </user> <links> <link rel="self" href="http://server/projects/1/users"/> <link rel="create_user" href="http://server/projects/1/users"/> <link rel="get_user_mike" href="http://server/projects/1/users/12"/> <link rel="get_user_kurt" href="http://server/projects/1/users/23"/> <link rel="get_user_corey" href="http://server/projects/1/users/65"/> ... </links> </project>

Si un proyecto contiene, por ejemplo, 500 usuarios ... ¿no tendría 500 enlaces de usuarios en la carga útil? De lo contrario, ¿cuál es el mejor enfoque para rediseñar mis servicios web para manejar esta situación? ¿O es esto aceptable en el mundo real?

Cualquier pensamiento o sugerencia son muy apreciados aquí. Gracias.


Para pensar por qué es lo correcto, imagine su API sin un enfoque HATEOAS: tendrá que publicar todos los esquemas URI posibles en su documentación (o en su WADL, si eso es lo que quiere), y desde ese momento en adelante No puedes cambiarlos sin romper a tus clientes.

En esencia, sus clientes estarán inextricablemente unidos a su elección de diseño de URI. Ese es un nivel de acoplamiento que puede evitar fácilmente simplemente documentando dónde se encuentran los enlaces en sus tipos de medios en lugar de documentar cómo se ven los enlaces también.

Dicho esto, podría estar bien que las necesidades de su aplicación adopten ese enfoque, y eso está bien. Solo tenga en cuenta que estará atascado con su diseño de URI durante mucho, mucho tiempo. Aunque estarás en buena compañía .


Para su ejemplo en particular, creo que tiene sentido volver a HTML. Si muestra una lista de 500 recursos en HTML, ¿incluiría un enlace a cada recurso para que los usuarios puedan obtener más información? Probablemente lo harías. Una API REST no es muy diferente: si devuelve una lista de 500 recursos, debe incluir 500 enlaces para que los usuarios puedan obtener más información sobre cada recurso.

Esperar que los clientes construyan URL basadas en algunas ID o nombres sería como pedirles a los usuarios que escriban manualmente las URL en la barra de direcciones del navegador.

Aquí hay un muy buen artículo sobre esto, en particular:

Al igual que los archivos HTML se vinculan entre sí con etiquetas, o al igual que los archivos XML se vinculan entre sí con XLink, toda transferencia de estado se debe realizar únicamente como una reacción a un enlace que se encuentra dentro de una representación


Solo un punto de vista de la cuestión de los 500 usuarios: no soy un experto, pero tengo entendido que puede proporcionar la paginación con tranquilidad:

/ project / 1 / users / pages / 1

<links> ... <link rel="get_user_mike" href="http://server/projects/1/users/12"/> <link rel="get_user_kurt" href="http://server/projects/1/users/23"/> <link rel="get_user_corey" href="http://server/projects/1/users/65"/> <link rel="get_page_2" href="http://server/projects/1/users/pages/2"/> </links>