Сбой «жидкого» шаблона тела набора Azure API Management с «Поток не читается» - PullRequest
0 голосов
/ 18 февраля 2019

Я работаю над изменением рабочей конечной точки управления API.Мне нужно было отправить тело запроса в бэкэнд-сервис для некоторой аутентификации / проверки перед вызовом бэкэнда.

Я использовал context.Request.Body.As<string>(preserveContent: true), чтобы получить копию исходного тела запроса.

Однако, теперь мой шаблон <set-body template="liquid"> завершается ошибкой с сообщением «Поток не читается».

Шаблон отвечает за преобразование тела запроса (XML) в формат JSON, который принимает серверная часть.

Насколько я понимаю, использование preserveContent: true позволит жидкому шаблону получить доступ к телу, но это не так.

Какие еще варианты у меня есть?Могу ли я сохранить тело в переменной и явно передать его в жидкость?Лучше ли просто вернуться к LINQ to XML, где я по крайней мере получил контроль над данными?

Редактировать:

С тех пор я отказался от использования этой функции жидкости для более подробного руководства,но надежный подход.

1 Ответ

0 голосов
/ 19 февраля 2019

С помощью следующих входящих политик управления 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>

Более подробную информацию можно найти в этой статье .

...