我正在努力改变工作的API管理端点。在调用后端服务之前,我需要将请求主体发送到后端服务以进行一些身份验证/验证。
我使用context.Request.Body.As<string>(preserveContent: true)
获取原始请求正文的副本。
但是,现在我的<set-body template="liquid">
模板失败并显示消息“Stream is not readable”。
模板负责将请求主体(即XML)转换为后端接受的JSON格式。
据我所知,使用preserveContent: true
将允许液体模板进入身体,但似乎并非如此。
我还有其他选择吗?我可以将物体存储在变量上并明确地将其传递给液体吗?是否更好地恢复到LINQ to XML,我至少可以控制数据?
编辑:
从那以后,我一直放弃使用这种液体特性来获得更加手动但可靠的方法。
通过以下入站API管理策略,使用Liquid模板,它将转换为有效的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。