在 Azure API 管理中重命名出站请求中的查询参数

Rename Query Parameter in Outbound Request in Azure API Management

使用 Azure API 管理中的策略,我正在尝试重命名查询参数,但它不起作用。如果我将 copy-unmatched-params="false" 更改为 copy-unmatched-params="true" 那么它就可以工作,但是行为会变成所有不匹配的参数都将传递到后端 API 这将允许客户端将他们自己的查询参数注入到我们不想要的后端请求中。

其他一切都很好。

我想转换一个看起来像这样的请求:

https://{site}/search?query=dylan

收件人:

https://{backend-site}documents?api-version=2018-1-11&amount=1000&searchFields=Album,Artist&search=dylan

唯一不起作用的部分是将查询参数转换为命名为 "search" 而不是查询,而不允许从入站查询字符串传递所有参数。我该如何解决?

<policies>
    <inbound>
        <rewrite-uri template="/" copy-unmatched-params="false" />
        <set-header name="api-key" exists-action="override">
            <value>THIS-IS-API-KEI</value>
        </set-header>
        <set-query-parameter name="api-version" exists-action="override">
            <value>2018-1-11</value>
        </set-query-parameter>
        <set-query-parameter name="amount" exists-action="override">
            <value>1000</value>
        </set-query-parameter>
        <set-query-parameter name="searchFields" exists-action="override">
            <value>Album,Artist</value>
        </set-query-parameter>
        <set-query-parameter name="search" exists-action="override">
            <value>@(context.Request.Url.Query.GetValueOrDefault("query"))</value>
        </set-query-parameter>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

你从最后一个表达式中得到空值的原因是因为那时你的 URI 已经重写为“/”并且只有 "api-version"、"amount" 和 "searchFields" 设置查询参数。有几种方法可以解决这个问题:

  1. 参考原文Url:@(context.Request.OriginalUrl.Query.GetValueOrDefault("query"))
  2. 将查询添加到操作 URI 模板 - search?query={query} - 并从 rewrite-uri 策略引用它:<rewrite-uri template="/?query={query}" copy-unmatched-params="false" />。缺点是 "query" 参数成为必需参数,因此没有它的任何请求都会导致 404.

尝试使用变量。在开始时将值赋给变量,并使用变量来分配新的查询参数

您可以使用 URL 的字符串和简单的替换方法重命名查询中的参数。在那种情况下,该参数将不是强制性的。

<inbound>
     <base />
     <rewrite-uri template="@{
        return "/some-url-here-or-your-previously-constructed-url" + context.Request.OriginalUrl.QueryString
            .Replace("old-name", "new-name");
         }" copy-unmatched-params="false" />
 </inbound>