2012-02-08 7 views
10

Estoy buscando desarrollar una aplicación en ASP.NET MVC 3 y me gustaría proporcionar una API pública al mismo tiempo.Versioning API REST de una aplicación ASP.NET MVC

Al mirar a su alrededor, parece haber 2 formas de hacerlo. Cree un área de API y tenga controladores que devuelvan json/xml. O use filtros de acción y un único conjunto de controladores frontales, y devuelva json/xml/html según los encabezados de las solicitudes.

Me gustaría hacerlo más tarde, pero me preguntaba cómo podría hacer para versionar su API si fuera por esta ruta.

Si vas por la primera ruta, puedes simplemente crear un controlador v1/v2, pero si lo haces más tarde, ¿cómo podrías versionarlo?

Respuesta

3

Puede hacer una de estas dos rutas: puede incluir la API en la ruta (en lugar de http://app.lication/category/1 tendría algo así como http://app.lication/api/v1/category/1) o podría incluir un custom HTTP header.

Cualquiera de los dos le permitirá discriminar a qué versión se llama.

+0

En relación con la opción 1, ¿puede dar más detalles? No es obvio cómo hacerlo al hacer lo que el OP quiere hacer: un único conjunto de controladores que devuelve json/xml/html dependiendo de los encabezados de las solicitudes. Dado que presumiblemente él no quiere el '/ v1' en sus URL html. –

+0

@GabeMoothart - usaría el enrutamiento ASP.Net (http://msdn.microsoft.com/en-us/library/cc668201.aspx) para definir/extraer los parámetros de URL. Hacer que la API sea parte de la ruta no significa que necesite tener un controlador por API (ni tampoco lo impide, si las API son radicalmente divergentes). – 48klocs

10

El control de versiones es un problema bastante complejo para empezar. He aquí algunas maneras en las que miré antes:

  1. URL. En este caso, se supone que https://api.example.com/v1/projects es un recurso diferente de http://api.example.com/v2/projects, aunque no es el caso. Basecamp parece hacer esto. Siguiendo este enfoque, suponga que siempre tendrá que admitir API antiguas.
  2. Encabezados. Las URL siguen siendo las mismas, sin embargo, el cliente pasa un encabezado HTTP adicional, digamos X-MYAPI-VERSION con cada solicitud con un valor que identifica la versión de la API que se va a usar. El Google Documents List API hace esto. Un problema potencial con este enfoque es que los encabezados HTTP pueden ser eliminados por intermediarios entre el cliente y el servidor.
  3. Parámetros. Para evitar el problema con la opción 2, puede pasar la versión de la API para utilizarla como parámetro (como https://api.example.com/projects?v=3).
  4. Tipos de medios. Aquí sus URL permanecen iguales, sin embargo, se requiere que los usuarios especifiquen la representación de los recursos usando los encabezados de aceptar y de tipo de contenido. Por ejemplo, un "proyecto" se puede presentar usando "application/vnd.mycompany.resource [-version] [+ format]" dando sus representaciones de "application/vnd.mycompany.project-v1 + json" para v1 json o " application/vnd.mycompany.project-v1 + xml "para v1 xml. Cuando necesite una nueva versión de un proyecto, el tipo de mime se verá como sigue "application/vnd.mycompany.project-v2 + xml". Github parece apoyar eso.
  5. Parte de la carga útil. En este caso, la carga útil de la solicitud contiene el número de versión que se utilizará. Por ejemplo, cuando se pasa XML, puede mirar el espacio de nombres para determinar qué versión de la API se está utilizando. Para JSON, puede usar una propiedad "$ version" o "_version" para especificar la versión.
  6. Clave de cliente. Cuando la aplicación se registra, especifica qué versión de la API quiere usar. Cuando autentica al cliente, se asegura de que emule la versión que quiere usar.
  7. Sin versiones explícitas Siempre existe la opción de no versionar su API y tratar de manejar los cambios de forma transparente haciendo que todos los campos sean opcionales y los maneje apropiadamente cuando faltan. Lo más probable es que lo haga de todos modos para que las versiones futuras de su API sean compatibles con la versión que está desarrollando actualmente.

Muchos recomiendan la opción 4, aunque no siempre es práctica. La mayoría de estas opciones requieren trabajo adicional para trabajar con ASP.NET MVC.

+2

Si le interesa el enfoque n. ° 1 (mi preferencia), consulte este paquete NuGet y el código/ejemplos correspondientes en GitHub: https://www.nuget.org/packages/VersionedRestApi/1.0.0.2 – jakejgordon

+0

Para el enfoque # 2 (mi preferencia), User-Agent sería el encabezado correcto para este enfoque (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.43). "El campo puede contener varios tokens de productos (sección 3.8) y comentarios que identifiquen el agente y cualquier subproducto que forme parte significativa del agente de usuario" Ejemplo sería: User-Agent: YOUR_API_ID/2.0 –

+1

No lo hago de acuerdo con el uso del User-Agent para la versión de las API. La especificación se refiere al producto del cliente. Por ejemplo, el navegador que se está conectando al servidor HTTP. Tiene mucho más beneficio cuando el desarrollador de la aplicación del cliente usa el User-Agent para especificar su cliente, de modo que podemos rastrear el uso de la API desde la perspectiva del cliente. Muy útil cuando AppX/1.1 falla en algunas llamadas a MyAPI v1.1, pero AppX/1.2 no lo hace. Perderá ese tipo de seguimiento. – bloudraak