2012-06-27 838 views
14

Tengo una pregunta logística: estoy tratando de encontrar la mejor manera de administrar las API que no están sincronizadas con una aplicación. La mejor manera de explicarlo es con un ejemplo:La mejor manera de administrar actualizaciones en una aplicación cliente/servidor iOS

Digamos que MyApp Versión 1.0 publica una API "submit_feedbacK" que requiere first_name, last_name y email.

Luego envío la versión 2.0 de MyApp a la tienda de aplicaciones. Esa versión está diseñada para publicar first_name, last_name, gender y email en la API. Todos estos son campos obligatorios en la API.

El problema que tengo: - Si actualizo la API antes de la nueva aplicación es en vivo, se romperá Versión 1.0 - Si espero hasta la versión 2.0 es en directo y de forma remota paralizar 1.0, tengo que medir el tiempo correctamente.

Voy a adivinar que la "respuesta correcta" es mantener dos API diferentes. Pero si ambas API se publican en la misma base de datos en vivo, eso hace que las cosas sean un poco incómodas.

¿Alguien tiene sugerencias sobre cómo modelar esto?

+2

Creo que la idea general es intentar diseñar la API y la estructura de la base de datos no necesitará cambios de ruptura por un tiempo para minimizar el total neto de torpeza. Si el valor de 'gender' no fue absolutamente necesario durante toda la vida de 1.0, probablemente pueda arreglárselas sin los usuarios que aún no lo han actualizado y lo hayan enviado durante la transición de la versión. – millimoose

+0

Es cierto: el nuevo campo también podría ser "masculino" si no se proporciona un valor, ya que la aplicación heredada no lo proporcionaría. Creo que estoy más preocupado por los cambios complejos, como si un concepto necesita ser abordado nuevamente. Pero como dijiste, si los cambios importantes se mantienen raros, el resto probablemente se pueda abordar a través de anuncios de inactividad. También recordé que es posible elegir cuándo se activa una aplicación, lo que ayudará a controlar las actualizaciones. ¡De todos modos, gracias por los comentarios! – Anthony

Respuesta

7

Esta pregunta puede compartir algunos aspectos con iOS consuming API design.

La respuesta correcta es definitivamente proporcionar dos API (al menos por un corto período de tiempo mientras los usuarios se ajustan). No es necesario que mantenga dos versiones al mismo tiempo, ya que una vez que se lanza una versión más nueva, puede mantenerla y simplemente proporcionar la anterior para usuarios heredados. Los únicos cambios reales que puede tener que hacer son cosas como parches de seguridad o problemas importantes. Los cambios importantes (como la decisión de reestructurar toda su base de datos) pueden llevar a que la versión anterior no funcione, sin embargo, la actualización a las versiones más nuevas de la API debe diseñarse para permitir que las versiones anteriores sigan funcionando.

La otra pregunta a la que te he vinculado brinda una respuesta sobre cómo puedes tener diferentes versiones de tu aplicación accediendo a la versión correcta de la API.

Otra nota es que puede ser más fácil para usted (dependiendo de qué marco está utilizando) diseñar sus API como motores o subapps, y simplemente montarlos en diferentes puntos finales. Sé que esto se puede hacer fácilmente en Rails usando motores, y en Node with Express usando app.use() con sub-aplicaciones.

+0

¿Conoces una forma de hacer esto en codeigniter? Estaba pensando en hacer que cada versión de la API amplíe la versión anterior y modifique solo lo que sea necesario. –

+0

No, yo no. No he usado CodeIgniter, sin embargo, google puede ser tu amigo en esto. –

0

Utilizaría un punto de servicio web/http para la comunicación con su aplicación. Si prefiere mantener la misma URL en todas las versiones de la aplicación, incluya un número de versión en todas las solicitudes/publicaciones en el servidor para que sepa cómo manejarlas. Esto también facilitará el desarrollo y las pruebas ya que las nuevas versiones pueden probar contra la nueva API en el servidor.

De modo que en cualquier función puede llamar al servicio web/servidor y agregar una sola variable con el número de versión. un BYTE debería ser suficiente, ya que creo que podrías comenzar de nuevo y "matar soporte para v1.0" una vez que aciertes 256 versiones de la misma función (si es que alguna vez).

Una vez que el servidor recibe una solicitud/publicación con datos, puede simplemente codificar una estructura de conmutador/caso simple en la API del servidor para que soporte funcione para ambas versiones.

Si lo hacen de manera similar, pero por ej. intercambia los parámetros o algo así, puede manejar todos estos servidores y se puede mantener BAL/DAL (estructura de n niveles) en la parte del servidor de la solución.

Btw.mi respuesta no es solo para iOS o dispositivos inteligentes, sino solo un enfoque de cliente/servidor para una configuración de producción "en proceso" en la que todo tiene que estar en línea, mientras se está desarrollando y manteniendo.

Espero que tenga sentido, de lo contrario, coméntelo y trataré de explicarlo más.

0

solo para FYI, utilizo CodeIgniter. Estoy usando el controlador REST proporcionado en https://github.com/philsturgeon/codeigniter-restserver. Terminé terminando por establecer diferentes puntos finales para cada versión. Básicamente verificaría un nuevo repositorio para cada lanzamiento y lo colocaría en un directorio único. (es decir, http://www.mysite.com/1.0/api/method, http://www.mysite.com/1.1/api/method, etc.) Tratar de mantener múltiples versiones de una API bajo una base de código sonaba demasiado aterrador. Al menos cuando lancé una versión, sabría que está bloqueada en piedra y no tengo que preocuparme por romperla. (Nota: tuve que usar un tweak .htaccess especial para obtener varias instancias de CodeIgniter ejecutándose desde el mismo dominio. Puedo compartirlo si lo desea)

+0

¿Está diciendo que cuando lanza una versión (digamos, 2.0), efectivamente coloca su 2.0 en un repositorio nuevo para 2.1? Este enfoque parece dar un resultado final similar a las sub-aplicaciones/motores –

+0

Exactamente. Pensé en tratar de mantenerlo como una gran base de código, pero la pregunta que planteé fue: cuando tengo 100 versiones de esta API (1.0.0, 1.0.1, 1.0.2, 1.1.0, etc.), hago Realmente quiero tener todas esas versiones en una base de código gigante? La respuesta simple fue no, eso sería una pesadilla. Mejor solo bifurcar cada API y guardarla para que no tenga que preocuparme por dañarla. Cada versión de la aplicación puede apuntar a su propia API específica y no preocuparse por las versiones anteriores o futuras, a menos que desactive deliberadamente una y obligue a las personas a migrar a la última aplicación. – Anthony

+0

El control de versiones de la base de datos sigue siendo un problema, pero he descubierto que casi todos mis cambios de bases de datos agregan columnas. No muchos cambian la estructura de lo que ya hice. Si ese es el caso, entonces es hora de considerar que cambie un nuevo tipo de modelo, como "user_v2" y migrar datos antiguos a la nueva estructura. Anywho, ese fue mi enfoque. – Anthony

Cuestiones relacionadas