Почему политика Set-Body не распознает мое тело POST? - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь подключить конечную точку 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": ""
} 

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

<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 Ответ

1 голос
/ 29 марта 2019

Чтобы получить доступ к телу как к объекту в жидком шаблоне, вам нужно будет установить заголовок 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* Похоже, что у 1021 * нет проблем, о которых вы упоминали.
Был ли другой документ, на который вы ссылаетесь?Если на docs.microsoft.com, вы можете открыть вопрос в конце каждого документа.

...