在策略定义中返回响应时如何使用变量?

时间:2019-09-25 13:04:50

标签: azure string-concatenation azure-api-management

我正在Azure API管理实例中配置入站策略。

首先,我设置一个变量:

<set-variable name="var1" value="" />

然后我发送一个请求

<send-request mode="new" response-variable-name="var1" timeout="20" ignore-error="false">

哪个返回JSON。测试时,我在“跟踪”选项卡中收到以下消息:

  

已发送对“ https://my-api.azure-api.net/api/data”的GET请求,结果存储在“ var1”变量中。

我猜发送请求策略有效,结果存储在变量中。 然后我想返回一个响应(仍然在入站,尝试在出站时得到500):

<return-response response-variable-name="existing response variable">
    <set-status code="200" reason="OK" />
    <set-header name="Content-Type" exists-action="override">
        <value>application/json</value>
    </set-header>
    <set-body>
    {
        "success": true,
        "var1": context.Variables["var1"]
    }
    </set-body>
</return-response>

我的问题是它不起作用...它只会呈现context.Variables["var1"]

也是如此:

  • @context.Variables["var1"]
  • @{ context.Variables.GetValueOrDefault<string>("var1") }
  • @context.Variables.GetValueOrDefault("var1")

所有这些都以书面形式呈现,没有任何值被提取。

编辑:我还尝试添加一个占位符字符串,然后使用

<find-and-replace from="Placeholder" to="context.Variables.GetValueOrDefault("var1")" />

并尝试将其放入入站和出站。但是这项政策没有启动。

这是我想附加到响应中的JSON对象(小细节:实际上,我有多个变量的问题)。

我的问题是:如何将声明的变量添加到响应中?

2 个答案:

答案 0 :(得分:1)

有两种方法可以解决此问题。您可以为此使用策略表达式:https://docs.microsoft.com/en-us/azure/api-management/api-management-policy-expressions。要记住的是,它们只能用于构建政策的整体价值,而不能构成其一部分,因此:

git remote set-url git@github.com:USERNAME/REPOSITORY.git

或者通过<set-body>@("{\"success\": true, \"var1\": " + ((IResponse)context.Variables["var1"]).Body.As<string>() + "}"</set-body> 策略,您可以使用液体模板:

set-body

答案 1 :(得分:0)

我假设您在主要请求流程之外还有一些补充请求。

此示例将send-request的响应添加到主要请求的响应正文中:

<policies>
    <inbound>
        <base />
        <!-- main request -->
        <set-backend-service base-url="https://reqres.in" />
        <rewrite-uri template="/api/users/2" />
        <!-- sidecar request -->
        <send-request mode="new" response-variable-name="var1" timeout="20" ignore-error="true">
            <set-url>https://reqres.in/api/unkown/2</set-url>
            <set-method>GET</set-method>
        </send-request>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
        <set-body template="none">@{
            var body = context.Response.Body.As<JObject>(true);
            body["var1"] = ((IResponse)context.Variables["var1"]).Body.As<JObject>();
            return body.ToString();
        }</set-body>
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>