Azure API Management set-body“liquid”模板失败,“Stream is not readable”

问题描述 投票:0回答:1

我正在努力改变工作的API管理端点。在调用后端服务之前,我需要将请求主体发送到后端服务以进行一些身份验证/验证。

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

但是,现在我的<set-body template="liquid">模板失败并显示消息“Stream is not readable”。

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

据我所知,使用preserveContent: true将允许液体模板进入身体,但似乎并非如此。

我还有其他选择吗?我可以将物体存储在变量上并明确地将其传递给液体吗?是否更好地恢复到LINQ to XML,我至少可以控制数据?

编辑:

从那以后,我一直放弃使用这种液体特性来获得更加手动但可靠的方法。

liquid azure-api-management
1个回答
0
投票

通过以下入站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

© www.soinside.com 2019 - 2024. All rights reserved.