Api Management: Llamar a una Api diferente dependiendo de la petición recibida

En varias ocasiones me han contado un escenario en el que usando un sistema como Azure Api Management este sea capaz de llamar a una Api u otra (o una versión diferente de esa misma Api), utilizando la misma URL, dependiendo de la petición recibida. Lo cierto es que, gracias a las políticas, es una operación muy sencilla de gestionar. Para este caso lo que necesitas es combinar dos de ellas: control flow, que te permitirá evaluar las condiciones que se deben cumplir, y set-backend-service que sobreescribirá la URL base, que se definió cuando se dió de alta la API, sólo para aquellas peticiones que cumplan las condiciones establecidas.

En este ejemplo, he elegido una de las acciones de una Api llamada ApiAppA que devuelve el nombre de la API invocada.

<policies>
<inbound>
<choose>
<when condition="@(context.Request.Url.Query.GetValueOrDefault("version") == "demob")">
<set-backend-service base-url="https://microsoft-apiappec9465d6c4fa4eb699946d8e7e1c875c.azurewebsites.net/" />
</when>
<otherwise />
</choose>
<base />
</inbound>
<outbound>
<base />
</outbound>
</policies>

Al ser una regla que se gestiona al recibir la petición la misma debe estar incluída en el apartado inbound. Los tags choose se corresponden con la política control flowEn el apartado when es donde se indica la condición/es que se deben cumplir para aplicar, en este caso, la política set-backend-service, la cual modificará la URL base de la Api que ha recibido la llamada, que para este ejemplo apuntará a ApiAppB. Para construir las condiciones puedes valerte de la documentación de este enlace. En el ejemplo se puede ver que utilizo @(context.Request.Url.Query.GetValueOrDefault(“version”) == “demob”), lo cual significa que si en la petición que recibo tengo el valor demob para el parámetro “version” en la query se deberá modificar el backend para apuntar a ApiAppB.

Para poder probarlo, he creado un nuevo parámetro opcional llamado “version” para esa operación

ApiAppA new parameter called version - change backend service

Si utilizas la consola en el Developer portal, podrás comprobar que la Api recuperará el valor correspondiente a la URL especificada en su definición pero, si añadimos el valor demob al parámetro opcional “version” la ApiAppB será llamada en lugar.

ApiAppA calling ApiAppB using version parameter

¡Saludos!