将含--data参数的CURL GET请求转为PowerShell请求时遇参数缺失报错
解决CURL GET请求带请求体转PowerShell的问题
我懂你遇到的困扰了——CURL里的--data参数在GET请求里会把JSON数据塞进请求体里,但PowerShell 5.1的Invoke-RestMethod默认对GET请求的-Body参数处理逻辑不一样:它会把哈希表自动转成URL查询参数(比如?net_cidr=10.0.0.0/8),而不是放到请求体里,这就导致API没在预期的位置拿到参数,所以才会报错说缺少net_id(本质是API期望从请求体读取net_cidr,结果只接收到空或者错误位置的参数)。
另外你还要注意CURL里的-k是忽略SSL证书验证,PowerShell 5.1没有直接对应的-SkipCertificateCheck参数,得手动加一段代码处理证书问题。
下面是修正后的完整代码:
# 忽略SSL证书验证(对应CURL的-k参数) add-type @" using System.Net; using System.Security.Cryptography.X509Certificates; public class TrustAllCertsPolicy : ICertificatePolicy { public bool CheckValidationResult( ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) { return true; } } "@ [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12 # 第一步:获取认证token $authBody = ConvertTo-Json @{"username"="Test";"password"="Test"} $tokenResponse = Invoke-WebRequest -Uri "https://RestAPI-URL" -Body $authBody -ContentType "application/json" -Method POST $token = ($tokenResponse.Content | ConvertFrom-Json).access_token # 第二步:构建GET请求的请求体(必须转成JSON字符串) $header = @{auth="Basic $token"} $requestBody = ConvertTo-Json @{ net_cidr = '10.0.0.0/8' } # 发送GET请求,确保Body是JSON字符串且指定ContentType Invoke-RestMethod -Uri "https://RestAPI-URL" -Headers $header -Body $requestBody -Method GET -ContentType "application/json"
关键修正说明:
- 把哈希表
$Parameters通过ConvertTo-Json转成JSON字符串再传给-Body,这样PowerShell才会把数据放到请求体里,而不是自动转成查询参数 - 添加了忽略SSL证书验证的代码,匹配CURL的
-k行为 - 明确指定
-ContentType为application/json,告诉API请求体的格式
另外要确认你的API确实支持GET请求带请求体——虽然HTTP规范里GET请求通常不建议带请求体,但有些API会这么设计,CURL支持这种行为,而PowerShell默认会调整GET请求的Body处理逻辑,所以我们需要手动指定JSON字符串来绕过这个默认行为。
内容的提问来源于stack exchange,提问作者jeremias kühnis
相关产品推荐
相关产品推荐

