Azure API管理集主体“液体”模板失败,并显示“流不可读”

时间:2019-02-18 16:22:25

标签: liquid azure-api-management

我正在努力更改可正常使用的API管理端点。在调用后端服务之前,我需要将请求正文发送到后端服务以进行一些身份验证/确认。

我使用context.Request.Body.As<string>(preserveContent: true)来获取原始请求正文的副本。

但是,现在我的<set-body template="liquid">模板失败,并显示消息“流不可读”。

模板负责将请求主体(XML)转换为后端接受的JSON格式。

据我了解,使用preserveContent: true可以使液体模板进入人体,但事实并非如此。

我还有什么其他选择?我可以将主体存储在变量上并将其显式传递给液体吗?仅仅恢复到我至少可以控制数据的LINQ to XML更好吗?

编辑:

从那时起,我就不再使用液体的这种功能,而是采用一种更加手动但可靠的方法。

1 个答案:

答案 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