必须用 -InFile 上传 XML 文件,配合 -Headers 指定 Content-Type,不可用 -Body;因 -Body 会触发自动序列化和编码转换,导致格式丢失、乱码或服务端拒收。

上传XML文件必须用 -InFile,不能靠 -Body
PowerShell 的 Invoke-RestMethod 本身不支持直接把 XML 字符串当 -Body 发送并自动设对 Content-Type——它会默认用 application/json 或空类型,后端通常直接拒收。真正可靠的方式是让 PowerShell 把文件二进制原样发出,并手动指定头。
-
-InFile参数会以原始字节流读取文件,跳过任何编码/序列化逻辑,适合 XML、PDF、ZIP 等非文本格式 - 必须显式加
-Headers @{ "Content-Type" = "text/xml" }(或application/xml,看 API 要求) - 如果 XML 文件含 BOM 或编码声明(如
),确保文件实际保存为对应编码(通常是 UTF-8 无 BOM)
Invoke-RestMethod 上传 XML 的最小可行命令
假设你要向 https://api.example.com/upload POST 一个本地 data.xml:
Invoke-RestMethod -Uri "https://api.example.com/upload" `
-Method Post `
-InFile ".\data.xml" `
-Headers @{ "Content-Type" = "text/xml" } `
-Credential $cred
注意几点:
-
-InFile值必须是**绝对路径或相对于当前工作目录的相对路径**;用Get-Location确认当前路径,或改用Join-Path $PSScriptRoot "data.xml" -
-Credential非必需,但多数生产 API 需认证;若用 API Key,换成-Headers @{ "Authorization" = "Bearer abc123" } - 不要加
-ContentType参数——它和-InFile冲突,会被忽略;只用-Headers设 Content-Type
为什么不用 [xml] 类型 + -Body?
有人试过先用 [xml]$xml = Get-Content file.xml 再转成字符串传 -Body,这会导致三类问题:
- XML 对象序列化后丢失缩进、注释、处理指令(如
) - PowerShell 默认用 UTF-16 编码字符串,而 HTTP body 没有编码声明,服务端常按 UTF-8 解析 → 出现乱码或解析失败
-
-Body会触发ConvertTo-Json式自动转换逻辑(即使你传的是字符串),可能额外转义成\u003c
结论:只要文件存在磁盘,就别读进内存再发;-InFile 是唯一干净路径。
调试时怎么确认发出去的就是原 XML?
最直接的方法是用 curl 对比(PowerShell 7+ 自带):
curl -X POST https://api.example.com/upload ` -H "Content-Type: text/xml" ` -d "@./data.xml"
如果 curl 成功而 Invoke-RestMethod 失败,大概率是:
- PowerShell 版本太老(-InFile,必须升级或换
Invoke-WebRequest) - 目标 URL 用了 HTTPS 但服务器证书不受信 → 加
-SkipCertificateCheck(仅测试环境) - XML 文件路径错、权限不足、或被杀毒软件锁定
真正的坑往往不在语法,而在路径、编码、证书这三处——发之前先 Test-Path .\data.xml 和 Get-Content .\data.xml -Encoding UTF8 -TotalCount 3 看开头是否正常。










