如何在响应中将两个变量合并为一个?

时间:2019-09-24 13:50:54

标签: azure rest web-services azure-api-management

我向Azure API管理添加了两个API。它基本上是相同的API,但适用于不同的环境。为了进行监视,我想创建一个操作,将在两个API中调用相同的方法并将其结果合并为一个。我目前正在使用具有模拟数据的模拟API。

为此,我用空白操作创建了空白API。在此操作中,我声明了以下入站策略:

<inbound>
    <set-variable name="env1" value="" />
    <set-variable name="env2" value="" />
    <send-request mode="new" response-variable-name="env1" timeout="20" ignore-error="false">
        <set-url>https://env1-api.azure-api.net/api/data</set-url>
        <set-method>GET</set-method>
        <set-header name="Content-Type" exists-action="override">
            <value>application/json</value>
        </set-header>
    </send-request>
    <send-request mode="new" response-variable-name="env2" timeout="20" ignore-error="false">
        <set-url>https://env2-api.azure-api.net/api/data</set-url>
        <set-method>GET</set-method>
        <set-header name="Content-Type" exists-action="override">
            <value>application/json</value>
        </set-header>
    </send-request>
    <base />
</inbound>

经过测试后,称为throws 500的操作(我认为这是可以理解的,因为未设置任何响应)。当我查看“跟踪”选项卡时,我会看到两条消息:

  

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

     

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

基于此,我得出结论,这些呼叫正常运行。这就是我卡住的地方。我不知道如何在响应中合并这两个变量。

API以JSON对象的形式返回对象数组。我要实现的是将这两个响应合并为一个将由操作返回的响应。如何撰写回复?

请记住,我是Azure的菜鸟,所以我的方法可能太原始了。如果您有更好的东西,我很想听听。

2 个答案:

答案 0 :(得分:2)

看看退货政策:https://docs.microsoft.com/en-us/azure/api-management/api-management-advanced-policies#ReturnResponse

在set-body下,您可以合并这两个字符串。

答案 1 :(得分:1)

要在return-response policy内添加Aleksander的答案,有两种方法可以组成最终主体

  1. 使用策略表达式
<set-body>@{
    var output = new
    {
        success = true,
        var1 = context.Variables["var1"]
    };
    return JsonConvert.SerializeObject(output);
}</set-body>
  1. 使用液体模板
<set-variable name="var1body" value="@((IResponse)context.Variables["var1"]).Body.As<string>())" />
<set-body template="liquid">{
"success": true,
"var1": "{{context.Variables["var1body"]}}"
}</set-body>

您可以在其文档中详细了解set-body policy