首页 > 解决方案 > 为什么在入站策略中使用 xml-to-json 策略会导致正文为空?

问题描述

文档参考:https ://docs.microsoft.com/en-us/azure/api-management/api-management-transformation-policies#example-1

我的“入站处理”政策片段:

<inbound>
   <base />
   <xml-to-json kind="direct" apply="always" consider-accept-header="false" />
</inbound>

问题: 当我在“入站处理”中应用此策略时Logic App,被调用的后端 API ( ) 被赋予一个空主体。接收此请求的 API 显示Content-Length = 0.

跟踪结果:

xml-to-json (0.697 ms)
"XML-to-JSON policy was applied. Original Content-Length header was removed as its value was invalidated. Content-Type header was set to 'application/json'."

注意: 当我在“出站处理”策略中应用这个完全相同的策略时,我得到了我期望的 JSON 结果。

我发送的基本 XML 示例:

<note>
    <to>PersonOne</to>
    <from>PersonTwo</from>
    <heading>Test</heading>
    <body>Example</body>
</note>

在“出站策略”部分应用策略时我得到的结果(按预期工作):

{
    "note": {
        "to": "PersonOne",
        "from": "PersonTwo",
        "heading": "Test",
        "body": "Example"
    }
}

标签: azureazure-api-management

解决方案


这是由于 APIM 将 XML 转换为 JSON 时删除了原始 Content-Length 标头造成的。如果您在 APIM 中执行测试请求并查看跟踪控制台,您将看到如下消息:

“已应用 XML 到 JSON 策略。原始 Content-Length 标头已被删除,因为它的值已失效。Content-Type 标头设置为 'application/json'。”

APIM 将标头替换为

传输编码:分块

并将 Content-Length 设置为 0。不幸的是,逻辑应用程序不支持触发器上的分块编码(仅在某些操作上),因此无法处理请求。


推荐阅读