Как использовать переменную при возврате ответа в определении политики? - PullRequest
0 голосов
/ 25 сентября 2019

Я настраиваю входящие политики в экземпляре Azure API Management.

Сначала я устанавливаю переменную:

<set-variable name="var1" value="" />

Затем отправляю запрос

<send-request mode="new" response-variable-name="var1" timeout="20" ignore-error="false">

Что возвращает JSON.При тестировании я получаю следующее сообщение на вкладке трассировки:

GET запрос к 'https://my -api.azure-api.net / api / data ' был отправлен,результат сохраняется в переменной 'var1'.

Я полагаю, что политика отправки запросов работает, и результат сохраняется в переменной.Затем я хочу вернуть ответ (все еще во входящем, я получаю 500 при попытке сделать это в исходящем):

<return-response response-variable-name="existing response variable">
    <set-status code="200" reason="OK" />
    <set-header name="Content-Type" exists-action="override">
        <value>application/json</value>
    </set-header>
    <set-body>
    {
        "success": true,
        "var1": context.Variables["var1"]
    }
    </set-body>
</return-response>

Моя проблема в том, что он не работает ... Он просто отображает context.Variables["var1"].

И так же:

  • @context.Variables["var1"]
  • @{ context.Variables.GetValueOrDefault<string>("var1") }
  • @context.Variables.GetValueOrDefault("var1")

Все они отображаются как написанные, никакие значения не извлекаются.

Редактировать: я также попытался добавить строку-заполнитель и затем использовать

<find-and-replace from="Placeholder" to="context.Variables.GetValueOrDefault("var1")" />

И попытаться поместить ее во входящие и исходящиетак.Но эта политика не запускалась.

Это объект JSON, который я хочу добавить к ответу (небольшая деталь: на самом деле у меня есть эта проблема с несколькими переменными).

Мой вопрос:Как я могу добавить мою объявленную переменную в ответ?

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

Я полагаю, что у вас есть дополнительный запрос на добавочную информацию, выполняемый дополнительно к основному потоку запросов.

В этом примере добавляется ответ от send-request в тело ответа основного запроса:

<policies>
    <inbound>
        <base />
        <!-- main request -->
        <set-backend-service base-url="https://reqres.in" />
        <rewrite-uri template="/api/users/2" />
        <!-- sidecar request -->
        <send-request mode="new" response-variable-name="var1" timeout="20" ignore-error="true">
            <set-url>https://reqres.in/api/unkown/2</set-url>
            <set-method>GET</set-method>
        </send-request>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
        <set-body template="none">@{
            var body = context.Response.Body.As<JObject>(true);
            body["var1"] = ((IResponse)context.Variables["var1"]).Body.As<JObject>();
            return body.ToString();
        }</set-body>
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>
0 голосов
/ 26 сентября 2019

Есть два способа сделать это.Вы можете использовать выражения политики для этого: https://docs.microsoft.com/en-us/azure/api-management/api-management-policy-expressions. Следует помнить, что их можно использовать только для построения целого значения для политики, а не его части, поэтому:

<set-body>@("{\"success\": true, \"var1\": " + ((IResponse)context.Variables["var1"]).Body.As<string>() + "}"</set-body>

Илис политикой set-body вы можете использовать жидкий шаблон:

<set-varialbe name="var1body" value="@((IResponse)context.Variables["var1"]).Body.As<string>())" />
<set-body template="liquid">
{
    "success": true,
    "var1": {{context.Variables["var1body"]}}
}
</set-body>
...