.net - qatar - ¿Estrategias para actualizar o versionar servicios web?
team foundation server 2017 español (5)
La forma típica de versionar un servicio web es que los clientes especifiquen la versión deseada. Puede permitir restricciones simples, como "> 2.0", "<1.5" o "= 1.1". Naturalmente, desea minimizar el número de versiones compatibles para su propia cordura. Si un cliente no especifica una versión, asume la última.
Las técnicas para proporcionar la versión varían. Algunos abogan por usar la URL, otros alientan los encabezados, otros pueden incluirlo como un parámetro de la llamada a la API. Sin embargo, casi ninguno cambiaría el nombre del método. Eso es equivalente al "paquete" o al "espacio de nombres" de los que habla el enlace OSGi. Hará que la actualización sea muy difícil, e impedirá que las personas se actualicen más que cualquier cambio en el servicio real.
También depende de cómo acceda a sus servicios web. Si está usando REST, entonces mantener los URL limpios y usar los encabezados tiene más sentido (y sería trivial hackearlo como un parámetro de consulta, si es necesario). Si está utilizando SOAP / XMLRPC / whatever-RPC, entonces ponerlo en la URL generalmente está bien.
Edit 5/2011 FWIW, aunque no estoy de acuerdo, el blog de Apigee recomienda poner la versión en la URL .
Cómo el cliente especifica la versión suele ser bastante fácil. Lo que es más complicado es cómo se ejecutan todas las versiones al mismo tiempo. La mayoría de los idiomas no tienen una forma de cargar varias versiones de la misma biblioteca / módulo / clase / función en el mismo entorno de ejecución (ya sea una VM, un proceso o lo que sea) El enlace OSGi que proporcionó es la solución de Java para permitir esto.
En la práctica, OSGi será excesivo para la mayoría de las situaciones. Por lo general, es más fácil enviar las solicitudes en desuso a otro servidor o proceso.
Sin embargo, la mejor forma de "versionar" sus servicios es desarrollar extensibilidad y flexibilidad en ellos para que sigan siendo compatibles hacia adelante y hacia atrás. Eso no significa que todas las versiones deben ser compatibles entre sí, pero las versiones consecutivas deben ser compatibles entre sí.
Me interesa conocer las mejores prácticas sobre cómo se manejan las diferentes versiones de los servicios web.
Para aclarar, si tiene algunos métodos web expuestos como un servicio web, entonces desea agregar una característica / funcionalidad y, por lo tanto, cambiar la firma de esas llamadas a métodos, ¿cómo maneja esto de una manera que no rompa todo de sus clientes que actualmente llaman al servicio?
¿Implementas el servicio en una URL diferente?
Pones una versión en el nombre del método en sí (MyMethod, MyMethodv2 etc. - ugh ..)
¿Pasa una versión como parte de la llamada al método junto con una lista de parámetros?
¿Alguien sabe cómo manejan este escenario Google o Amazon con su extensa biblioteca de servicios web?
EDITAR: Hasta ahora he encontrado una buena información en este artículo de Oracle . También esta entrada de blog en algunos datos específicos de Java fue útil. Todavía tengo curiosidad por ver algunos de los otros enfoques.
No estoy seguro si entendí tu pregunta correctamente. Pero mis 2 centavos. Si la firma del método cambia como otro parámetro nuevo, ¿por qué no puede hacerse opcional? Pero si se cambia un tipo de datos de parámetro existente, entonces no es aplicable.
Vota esto si está mal. :)
Puedo decirles que la solución de crear doAPIFunction, doAPIFunctionV2 y doAPIFunctionV3, etc. no ha producido más que dolores de cabeza en el lugar donde trabajo. Agregue a esto que la falta de nombres de funciones claramente descriptivas significa todo tipo de locura.
Desea nombres de funciones de API claros y, si una API está cambiando, el objetivo sería intentar hacerlo de la manera más compatible posible. Yo sugeriría la versión de sus puntos de entrada para que cada punto de entrada admita una API estable y doFunction en example.org/api-1.0/ puede ser diferente de example.org/api-2.0 si hubiera una buena razón para cambiar la semántica.
Solía ser más sencillo cuando se podía tener el mismo nombre de método de servicio web y diferentes parámetros, hace años. :)
Una vez que escribe un servicio web, está haciendo un contrato con los clientes que esto es lo que apoyará.
Para métodos más antiguos, sugeriría el registro para ver si están siendo utilizados, y por quién, para ver si puede hacer que se actualicen.
Aparte de eso, lo mejor que puedes hacer es escribir un nuevo método, por lo que puedes tener varios nombres de funciones similares que difieran según la versión.
El problema de pasar un número de versión es que debe asegurarse de que los clientes siempre pasen un número válido, que si genera los apéndices funcionará, pero si no lo hace, entonces esto es muy frágil.
Poner un número de versión en el nombre parece funcionar mejor para mí, ya que hace obvio lo que es antiguo, y puede usar AOP para registrar más fácilmente las versiones anteriores de los métodos de servicio web.
Una forma de mitigar esto es codificar por contrato y estableciendo interfaces en piedra. Nunca puedes cambiar realmente las firmas de funciones, sin embargo, puedes sobrecargarlas. Considere la API .NET. Desaprueba algunos métodos, pero continúan funcionando porque los programas codificados a su alrededor pueden fallar. Una nueva versión del servicio puede estar expuesta en un URI diferente (v2.webservice.com) para darle una nueva hoja de ruta y v1 tendría que seguir siendo compatible.