我正在努力更改可正常使用的API管理端点。在调用后端服务之前,我需要将请求正文发送到后端服务以进行一些身份验证/确认。
我使用context.Request.Body.As<string>(preserveContent: true)
来获取原始请求正文的副本。
但是,现在我的<set-body template="liquid">
模板失败,并显示消息“流不可读”。
模板负责将请求主体(XML)转换为后端接受的JSON格式。
据我了解,使用preserveContent: true
可以使液体模板进入人体,但事实并非如此。
我还有什么其他选择?我可以将主体存储在变量上并将其显式传递给液体吗?仅仅恢复到我至少可以控制数据的LINQ to XML更好吗?
编辑:
从那时起,我就不再使用液体的这种功能,而是采用一种更加手动但可靠的方法。
答案 0 :(得分:0)
使用Liquid模板通过以下入站API管理策略,将其转换为有效的SOAP请求。
<inbound>
<base />
<!--Change for GET to POST-->
<set-method>POST</set-method>
<!--Set mandatory SOAPAction HTTP header-->
<set-header name="SOAPAction" exists-action="override">
<value>GetOrderDetails</value>
</set-header>
<!--Create SOAP Request via liquid template-->
<set-body template="liquid">
<GetOrderDetails xmlns="tvh.blogs">
<OrderId>{{context.Request.MatchedParameters["orderId"]}}</OrderId>
</GetOrderDetails>
</set-body>
</inbound>
在这种情况下,xml-to-json
策略是不够的,因为某些字段需要重命名,需要控制顺序并且需要格式化日期。
<outbound>
<base />
<!--Create JSON Response via liquid template-->
<set-body template="liquid">
{
"orderId" : "{{body.GetOrderDetailsResponse.OrderId}}",
}
</set-body>
<!--Set correct content type-->
<set-header name="Content-Type" exists-action="override">
<value>application/json</value>
</set-header>
</outbound>
有关更多详细信息,您可以参考此article。