He estado leyendo mucho sobre los beneficios potenciales si tuviera que convertir mis servicios web actuales de Restful para que sean lo más HATEOS posible. Entiendo la importancia de proporcionar enlaces en la carga útil para reducir la carga del consumidor al recordar las próximas acciones válidas disponibles. Sin embargo, no puedo entender cómo ayudará al consumidor de mis servicios web de Restful en realidad.¿Vale la pena lograr HATEOAS para servicios web tranquilos en el mundo real?
Para ilustrar, Tomo este ejemplo de Rest In Practice libro sobre cómo hacer una orden 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 al consumidor realizar un pago definida por la etiqueta <link>
. Sin embargo, en realidad, el consumidor aún necesita conocer toda la semántica de esa llamada al 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 aún necesita confiar en la documentación WADL para saber cómo hacer que invoque este servicio web con éxito. Estas etiquetas probablemente tengan más sentido si todas usan 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 consultar el WADL para determinar cómo invocarlo correctamente.
Mi siguiente preocupación es la posibilidad de terminar con una carga útil muy pesada con todas las etiquetas <link>
. Por ejemplo, si un GET en/proyectos/1/usuarios devuelve toda la información de los usuarios que pertenecen proyecto 1, supongo que voy a 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 decir, 500 usuarios ... ¿no tendría 500 enlaces de usuario 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 idea o sugerencia es muy apreciada aquí. Gracias.
+1 ... Gracias por su respuesta. En mi opinión, realmente no hay escapatoria de WADL ya sea que adopte el enfoque HATEOAS o no, porque al final, todavía necesitaré documentar el uso del método y todos los parámetros requeridos (solicitud, encabezados, etc.) que mi API pueda requerir . Hiciste un buen punto acerca de no romper el código del cliente cuando cambio el patrón URI un día, PERO si no resuelve el hecho de que el código del cliente TODAVÍA está estrechamente vinculado con mi API en realidad ... (continúa) – limc
Imagine , si tengo un POST/login que acepta 2 parámetros de solicitud ("usuario" y "contraseña") y un día decidí cambiar los parámetros (digamos, cambiando el nombre o agregando nuevos), aún así se romperá el código del cliente incluso si el URI es estable. La forma en que lo veo es HATEOAS definitivamente ayuda en algunas situaciones, pero es completamente inútil en otras situaciones, lo que me hace preguntarme si vale la pena adoptar HATEOAS o no. – limc
Sin embargo, su ejemplo de cambios de parámetros POST no tiene nada que ver con HATEOAS. HATEOAS se refiere al uso correcto de hipervínculos dentro del contenido de la carga útil devuelto por el servidor, no por el formato de los parámetros de URI (que obviamente tienen que documentarse en algún lugar y mantenerse por razones de compatibilidad). –