PowerShell Invoke-RestMethod提交数组开头Body请求报错问题
问题根因
抛出该错误是两个配置错误共同导致的:
- JSON序列化不符合接口要求:
ConvertTo-Json默认会枚举展开传入的单元素数组,原代码生成的请求体实际是单个对象{"ipAddress": "10.200.2.55"},并非接口要求的数组包裹结构;未指定序列化深度时,复杂嵌套结构还可能出现序列化截断。 - 请求头配置错误:调用
Invoke-RestMethod传字符串类型的Body时,默认Content-Type为application/x-www-form-urlencoded,服务端无法按JSON格式解析请求体,返回的异常响应被PowerShell解析时触发块长度不匹配报错。如果本地HTTPS服务使用自签名证书,证书校验失败也会触发同类错误。
正确实现代码
序列化完成后建议先输出$jsonBody校验,确认内容为[{"ipAddress": "10.200.2.55"}],与Postman中可正常调用的请求体完全一致后再发起请求。
- PowerShell 5.1 版本适配代码:
# 本地自签名HTTPS测试环境专用,跳过证书校验 [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true} $Url = "https://localhost/GetUpdateInfo" $requestData = @( @{ ipAddress = "10.200.2.55" } ) # -NoEnumerate参数禁止数组被展开,-Depth指定足够序列化深度避免内容截断 $jsonBody = ConvertTo-Json -InputObject $requestData -NoEnumerate -Depth 10 # 明确指定请求体格式为JSON Invoke-RestMethod -Method Post -Uri $Url -Body $jsonBody -ContentType "application/json"
- PowerShell 7+ 版本适配代码:
$Url = "https://localhost/GetUpdateInfo" $requestData = @( @{ ipAddress = "10.200.2.55" } ) $jsonBody = ConvertTo-Json -InputObject $requestData -NoEnumerate -Depth 10 # 原生支持跳过自签名证书校验,无需修改全局证书回调 Invoke-RestMethod -Method Post -Uri $Url -Body $jsonBody -ContentType "application/json" -SkipCertificateCheck
内容的提问来源于stack exchange,提问作者Pomidor_83
相关产品推荐
相关产品推荐

