Azure APIM问题:Liquid模板无法访问JSON请求体中的值
Azure APIM Liquid模板返回空值的解决方案
你的问题核心是Azure APIM默认将请求体body作为原始字符串处理,而非解析后的JSON对象,直接用点语法访问属性会找不到对应值,导致返回空。下面是两种可行的修复方案:
方案一:在Liquid模板中直接解析JSON字符串
修改set-body里的Liquid代码,使用parse_json过滤器将原始body字符串转为JSON对象后再访问属性:
{ "orderId" : "{{parse_json(body).GetOrderDetailsResponse.OrderId}}", "orderDate" : "{{parse_json(body).GetOrderDetailsResponse.OrderDate | Date: "dd/MM/yyyy"}}", "orderLines" : [ {% JSONArrayFor orderline in parse_json(body).GetOrderDetailsResponse.OrderLines.OrderLine %} { "product" : "{{orderline.Product}}", "amount" : "{{orderline.Amount}}" } {% endJSONArrayFor %} ] }
方案二:提前解析请求体为变量(更高效)
在return-response策略前添加set-variable,将请求体预解析为JSON对象,后续Liquid模板直接引用变量:
<inbound> <base /> <!-- 解析请求体为JSON变量,true表示读取后保留原始请求体 --> <set-variable name="requestBody" value="@(context.Request.Body.As<Newtonsoft.Json.Linq.JObject>(true))" /> <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 template="liquid"> { "orderId" : "{{variables.requestBody.GetOrderDetailsResponse.OrderId}}", "orderDate" : "{{variables.requestBody.GetOrderDetailsResponse.OrderDate | Date: "dd/MM/yyyy"}}", "orderLines" : [ {% JSONArrayFor orderline in variables.requestBody.GetOrderDetailsResponse.OrderLines.OrderLine %} { "product" : "{{orderline.Product}}", "amount" : "{{orderline.Amount}}" } {% endJSONArrayFor %} ] } </set-body> </return-response> </inbound>
额外注意事项
- 确保请求的
Content-Type头为application/json,这是APIM处理JSON请求的前提 - 方案二中的
As<JObject>(true)参数true必须保留,否则请求体被读取后会被清空,后续策略无法访问
内容的提问来源于stack exchange,提问作者Unicorn
相关产品推荐
相关产品推荐

