在策略定义中返回响应时如何使用变量?
How to use a variable when returning response in policy definition?
我正在 Azure API 管理实例中配置入站策略。
首先,我设置了一个变量:
<set-variable name="var1" value="" />
然后我发送请求
<send-request mode="new" response-variable-name="var1" timeout="20" ignore-error="false">
其中 return 是 JSON。测试时,我在跟踪选项卡中收到以下消息:
GET request to 'https://my-api.azure-api.net/api/data' has been sent, result stored in 'var1' variable.
我想发送请求策略有效,结果存储在变量中。
然后我想 return 一个响应(仍在入站,我在出站尝试时得到 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 我想附加到响应的对象(小细节:实际上我有多个变量的问题)。
我的问题是:如何将声明的变量添加到响应中?
有两种方法可以解决这个问题。您可以为此使用策略表达式:https://docs.microsoft.com/en-us/azure/api-management/api-management-policy-expressions。要记住的是,它们只能用于构建策略的整体价值,而不是其中的一部分,所以:
<set-body>@("{\"success\": true, \"var1\": " + ((IResponse)context.Variables["var1"]).Body.As<string>() + "}"</set-body>
或者根据 set-body
政策,您可以使用液体模板:
<set-variable name="var1body" value="@((IResponse)context.Variables["var1"]).Body.As<string>())" />
<set-body template="liquid">
{
"success": true,
"var1": {{context.Variables["var1body"]}}
}
</set-body>
我假设您在主请求流之外还有一些附加请求。
此示例将来自 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>
我正在 Azure API 管理实例中配置入站策略。
首先,我设置了一个变量:
<set-variable name="var1" value="" />
然后我发送请求
<send-request mode="new" response-variable-name="var1" timeout="20" ignore-error="false">
其中 return 是 JSON。测试时,我在跟踪选项卡中收到以下消息:
GET request to 'https://my-api.azure-api.net/api/data' has been sent, result stored in 'var1' variable.
我想发送请求策略有效,结果存储在变量中。 然后我想 return 一个响应(仍在入站,我在出站尝试时得到 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 我想附加到响应的对象(小细节:实际上我有多个变量的问题)。
我的问题是:如何将声明的变量添加到响应中?
有两种方法可以解决这个问题。您可以为此使用策略表达式:https://docs.microsoft.com/en-us/azure/api-management/api-management-policy-expressions。要记住的是,它们只能用于构建策略的整体价值,而不是其中的一部分,所以:
<set-body>@("{\"success\": true, \"var1\": " + ((IResponse)context.Variables["var1"]).Body.As<string>() + "}"</set-body>
或者根据 set-body
政策,您可以使用液体模板:
<set-variable name="var1body" value="@((IResponse)context.Variables["var1"]).Body.As<string>())" />
<set-body template="liquid">
{
"success": true,
"var1": {{context.Variables["var1body"]}}
}
</set-body>
我假设您在主请求流之外还有一些附加请求。
此示例将来自 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>