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
相关产品推荐
相关产品推荐

