我正在尝试将Azure(api管理)中的API端点连接到后端服务。但是,set-body策略不识别我的JSON主体,因此不会为后端调用转换它。
我已经尝试了所有迭代,我可以想到“液体”和“无”模板。微软文档是无用的,因为即使“液体”模板在文档中大写,而它需要小写。甚至每个人都指出的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?)
当我确实得到它没有错误时,它返回相同的“输出”:“”输出。
为了能够作为液体模板中的对象访问主体,您必须将Content-Type
标头设置为application/json
中提到的docs。
如果您的请求已经发送了此标头,那么它应该可以在不设置它的情况下工作。
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>()
中提到的docs一样访问它,所以像这样的东西
<set-body>@(context.Request.Body.As<string>())</set-body>
set-body
的官方参考似乎没有你提到的问题。
你指的是其他任何医生吗?如果它在docs.microsoft.com
上,你可以在每个文档的末尾打开一个问题。