Используйте Azure Api Management в качестве проходного
Я хотел бы создать политику в Azure API Management, которая перенаправляет все вызовы, начинающиеся с пути "proxy / search", на другой URL-адрес. Однако я не хочу импортировать / создавать конечные точки в APIM для каждой возможности, так как это делает его кошмаром обслуживания. Например..
- ПОЛУЧИТЕ https://whatever.azure-api.net/proxy/search?q=dogs
- ПОЛУЧИТЕ https://whatever.azure-api.net/proxy/search/categories?q=dogs
- ПОЛУЧИТЕ https://whatever.azure-api.net/proxy/search/categories/x/y/z/etc....?q=blah
в соответствующий...
- ПОЛУЧИТЕ https://mysearchapi.com/?q=dogs
- ПОЛУЧИТЕ https://mysearchapi.com/categories?q=dogs
- ПОЛУЧИТЕ https://mysearchapi.com/categories/x/y/z/etc....?q=blah
Я создал политику ниже, но похоже, что APIM хочет, чтобы точные маршруты отображались из нее в бэкэнд. Я не хочу этого делать, потому что этот прокси может перенаправлять на многие, многие маршруты API и т. Д...
<policies>
<inbound>
<base />
<set-variable name="baseUrlSearch" value="https://mysearchapi.com/" />
<set-variable name="matchSearch" value="proxy/search" />
<set-variable name="isRoutingComplete" value="false" />
<set-variable name="apiVersionDefaultSearch" value="1.0" />
<choose>
<when condition="@{return context.Request.Url.Path.Contains(context.Variables.GetValueOrDefault<string>("matchSearch"));}">
<set-backend-service base-url="@(context.Variables.GetValueOrDefault<string>("baseUrlSearch"))" />
<rewrite-uri template="@(context.Request.Url.Path.Replace(context.Variables.GetValueOrDefault<string>("matchSearch"), ""))" />
<set-header name="Api-Version" exists-action="skip">
<value>@(context.Variables.GetValueOrDefault<string>("apiVersionDefaultSearch"))</value>
</set-header>
<set-variable name="isRoutingComplete" value="true" />
</when>
<when condition="@(!context.Variables.GetValueOrDefault<bool>("isRoutingComplete"))">
<return-response>
<set-status code="400" reason="Bad Request Through Proxy" />
</return-response>
</when>
</choose>
</inbound>
<outbound>
<base />
</outbound>
</policies>
2 ответа
Вы делаете свою жизнь намного сложнее, чем нужно. Просто создайте операцию, которая использует /proxy/*
в качестве шаблона, и он будет соответствовать всем URL-адресам, которые вы определили.
Затем просто создайте политику для той операции, которая выполняет set-backend-service.
В дополнение к ответу Даррела Миллера, вот как я это получил...
Добавление операции...
{
"name": "Search_GET",
"method": "GET",
"urlTemplate": "/search/*",
"policies": null
}
Добавление политики для этой операции...
<policies>
<inbound>
<base />
<set-backend-service base-url="https://mysearchapi.com/" />
<rewrite-uri template="@(context.Request.Url.Path.Replace("search/", ""))" />
<set-header name="Api-Version" exists-action="skip">
<value>1.0</value>
</set-header>
</inbound>
<outbound>
<base />
</outbound>
</policies>