为什么Set-Body策略无法识别我的POST正文?

时间:2019-03-28 13:51:46

标签: azure-api-management azure-policy

我正在尝试将Azure(API管理)中的API终结点连接到后端服务。但是,set-body策略无法识别我的JSON主体,因此不会将其转换为后端调用。

我已经尝试过所有可以想到的“液体”和“无”模板的迭代。微软文档是无用的,因为即使文档中的“ liquid”模板也要大写,但它需要小写。甚至每个人都指向的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?)

当我确实得到它没有错误时,它将返回相同的“输出”:“”输出。

1 个答案:

答案 0 :(得分:1)

要能够将液体对象作为液体模板中的对象进行访问,您必须按照docs中所述将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变量进行访问,您必须像docs中所提到的那样以context.Request.Body.As<string>()对其进行访问,因此类似这样

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

set-body的官方参考书似乎没有您提到的问题。
您要参考其他文档吗?如果它位于docs.microsoft.com上,则可以在每个文档的末尾打开一个问题。