You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure APIM JSON转XML生成含BOM的XML,如何移除?

移除Azure APIM中json-to-xml策略生成的XML BOM

Azure APIM没有专门用于移除BOM的内置策略,但可以通过set-body结合C#脚本实现这个需求,具体方案如下:

解决方案:在转换后处理XML内容

在json-to-xml策略之后,添加set-body脚本,读取转换后的XML内容并移除开头的BOM字符。根据处理场景(请求体/响应体)调整脚本位置:

场景1:APIM接收ADF的JSON请求,转换为XML后转发给外部服务(处理请求体)

将以下策略放在inbound节点下,紧跟json-to-xml之后:

<json-to-xml apply="always" consider-accept-header="false" parse-date="false" namespace-separator=":" />
<set-body>@{
    string xmlContent = context.Request.Body.As<string>();
    // 检查并移除UTF-8 BOM对应的Unicode字符
    if (!string.IsNullOrEmpty(xmlContent) && xmlContent.StartsWith("\uFEFF"))
    {
        xmlContent = xmlContent.Substring(1);
    }
    return xmlContent;
}</set-body>
<set-header name="Content-Type" exists-action="override">
    <value>application/xml; charset=utf-8</value>
</set-header>

更可靠的字节数组处理方式

如果担心字符串编码带来的问题,可以直接操作字节数组,检查并跳过BOM的三个字节(EF BB BF):

<json-to-xml apply="always" consider-accept-header="false" parse-date="false" namespace-separator=":" />
<set-body>@{
    byte[] bodyBytes = context.Request.Body.As<byte[]>();
    // 验证是否为UTF-8 BOM开头
    if (bodyBytes.Length >= 3 && bodyBytes[0] == 0xEF && bodyBytes[1] == 0xBB && bodyBytes[2] == 0xBF)
    {
        return Encoding.UTF8.GetString(bodyBytes, 3, bodyBytes.Length - 3);
    }
    return Encoding.UTF8.GetString(bodyBytes);
}</set-body>

原理说明

json-to-xml策略生成的XML默认可能携带UTF-8 BOM(字节顺序标记),而部分外部服务无法兼容该标记。上述脚本通过检查内容开头的BOM标识(Unicode字符\uFEFF或字节序列EF BB BF),直接截取掉BOM部分,生成不带BOM的XML内容。

内容的提问来源于stack exchange,提问作者PeterS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 15:45:33