如何在PowerShell中无Body发起带嵌套参数的GET请求?
解决GET请求携带Body报错及嵌套参数转查询参数问题
一、问题根源
HTTP规范里,GET请求本就不应该携带请求体,虽然Postman这类工具允许这么做,但PowerShell的Invoke-RestMethod、部分服务器会严格遵循规范,直接拒绝带Body的GET请求,这就是你碰到报错的原因。
二、嵌套参数转查询参数的规则
嵌套JSON结构转查询参数,常用两种格式(后端一般都兼容):
- 点符号层级:比如
{"filter":{"name":"test","status":1}}→filter.name=test&filter.status=1 - 方括号层级:同上JSON →
filter[name]=test&filter[status]=1
三、PowerShell 实现方法
直接把参数拼进URL的查询字符串里,用Invoke-RestMethod发起GET请求即可。
示例1:手动拼接URL
假设原JSON Body是:
{ "page": 1, "pageSize": 10, "filter": { "keyword": "demo", "category": "tools" } }
对应的PowerShell命令:
$url = "https://你的API地址/data?page=1&pageSize=10&filter.keyword=demo&filter.category=tools" Invoke-RestMethod -Uri $url -Method Get
示例2:自动生成查询字符串(适合参数多的场景)
用哈希表定义参数,再自动拼接成合法的查询字符串:
# 定义所有参数,嵌套参数用点符号命名 $queryParams = @{ page = 1 pageSize = 10 "filter.keyword" = "demo" "filter.category" = "tools" } # 自动编码并拼接成查询字符串 $queryString = ($queryParams.GetEnumerator() | ForEach-Object { "$($_.Key)=$([Uri]::EscapeDataString($_.Value))" }) -join "&" # 拼接完整URL并发起请求 $url = "https://你的API地址/data?$queryString" Invoke-RestMethod -Uri $url -Method Get
[Uri]::EscapeDataString()用来处理特殊字符(比如空格、中文、&),避免URL格式错误。
四、curl 实现方法
同样把参数转成查询字符串,推荐用-G配合--data-urlencode,让curl自动处理编码,避免格式错误。
方式1:直接拼接URL
curl "https://你的API地址/data?page=1&pageSize=10&filter.keyword=demo&filter.category=tools"
方式2:自动编码(推荐)
用-G指定把参数转为GET查询字符串,--data-urlencode自动处理特殊字符:
curl -G "https://你的API地址/data" ^ --data-urlencode "page=1" ^ --data-urlencode "pageSize=10" ^ --data-urlencode "filter.keyword=demo" ^ --data-urlencode "filter.category=tools"
(Windows下用^换行,Linux/macOS用\)
五、注意事项
- 先确认后端API支持通过查询参数传递嵌套结构,如果API只接受POST请求的Body,那你得把请求方法改成POST。
- 特殊字符必须做URL编码,否则会导致请求失败或参数解析错误。
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

