Почему политика Set-Body не распознает мое тело POST?

Я пытаюсь подключить конечную точку API в Azure (управление API) к бэкэнд-службе. Однако политика set-body не распознает мое тело JSON и, следовательно, не преобразует его для внутреннего вызова.

Я перепробовал все итерации для шаблонов "Жидкость" и "Нет". Документация Microsoft бесполезна, поскольку даже "жидкий" шаблон пишется с заглавной буквы в документе, тогда как он ДОЛЖЕН быть строчным. Даже статья о Deep Dive, на которую все указывают, вводит в заблуждение и / или устарела.

Однажды мне удалось получить ссылку {{context.Request.OriginalUrl}} для работы с использованием жидкого шаблона, но я не могу получить ссылку {{body.json}} для работы

Вот политика, которую я имею в разделе (чисто для проверки - это бесполезно для того, что я делаю):

<set-body template="liquid">
    Calling User Agent: {{context.Request.OriginalUrl}}
</set-body>

И вот пример того, что я должен попробовать прочитать тело json (проходя через POST):

<set-body template="liquid">{{body}}</set-body>

Я пробовал несколько итераций и входов, как показано ниже:

<set-body template="liquid">{{body.json}}</set-body>

проходя через такое тело:

{"json":"this is an example body"}

Независимо от того, что я делаю, это то, что я вижу в трассировке после тестирования вызова:

set-body (0.069 ms)
{
    "input": null,
    "output": ""
} 

Я, очевидно, открыт для использования шаблона "нет", но я сталкиваюсь с теми же проблемами. Документация неверна - если я скопирую / вставлю пример:

<set-body>@(context.Body.As<String>())</set-body>

Я получаю ошибки как:

One or more fields contain incorrect values:
Error in element 'set-body' on line 32, column 10: 'IProxyRequestContext' does not contain a definition for 'Body' and no extension method 'Body' accepting a first argument of type 'IProxyRequestContext' could be found (are you missing a using directive or an assembly reference?)

и когда я получаю это не ошибка, он возвращает тот же вывод "output": "".

1 ответ

Решение

Чтобы иметь возможность доступа к телу как к объекту в жидком шаблоне, вам необходимо установить Content-Type заголовок к application/json как упомянуто в документах.
Если ваши запросы уже отправляют этот заголовок, он должен работать и без его настройки.

Такая политика в inbound раздел гарантирует, что он работает как положено

<set-header name="Content-Type" exists-action="override">
    <value>application/json</value>
</set-header>
<set-body template="liquid">{{body.json}}"}</set-body>

Что касается доступа к нему через context переменная, вы должны получить доступ к нему как context.Request.Body.As<string>() как уже упоминалось в документации, так что-то вроде этого

<set-body>@(context.Request.Body.As<string>())</set-body>

Официальная ссылка на set-body кажется, нет проблем, которые вы упомянули.
Был ли другой документ, на который вы ссылаетесь? Если его на docs.microsoft.com Вы можете открыть вопрос в конце каждого документа.

Другие вопросы по тегам