使用PowerShell调用MapQuest免费API查询时遇400错误求助
解决MapQuest反向地理编码API的400错误
你的代码出现400响应的核心问题是请求格式与API要求不匹配,以下是具体问题分析和修正方案:
问题点
- GET请求误用Body:MapQuest的反向地理编码GET接口要求参数通过URL查询字符串传递,而非请求Body。你第一段代码用GET方法却传递JSON Body,导致参数无法被API解析。
- POST请求未正确序列化:第二段代码用POST但未将哈希表转为JSON字符串,也未设置
Content-Type: application/json,PowerShell默认会把哈希表编码为表单数据,不符合API的JSON格式要求。
修正方案
方法1:使用GET请求(参数拼接URL)
$ApiKey = "xxxxx" # 替换为你的API密钥 $lat = 55.40988888 $lng = 11.39666277 # 将所有参数拼接至URL查询字符串 $Url = "http://www.mapquestapi.com/geocoding/v1/reverse?key=$ApiKey&location=$lat,$lng&thumbMaps=false&includeNearestIntersection=false&includeRoadMetadata=true" try { $response = Invoke-RestMethod -Uri $Url -Method Get $response } catch { Write-Error "请求失败:$_" }
方法2:使用POST请求(JSON请求体)
$ApiKey = "xxxxx" # 替换为你的API密钥 $Url = "http://www.mapquestapi.com/geocoding/v1/reverse?key=$ApiKey" # 构造请求体并转为JSON(注意使用布尔值而非字符串) $ApiBody = @{ location = @{ latLng = @{ lat = 55.40988888 lng = 11.39666277 } } options = @{ thumbMaps = $false } includeNearestIntersection = $false includeRoadMetadata = $true } | ConvertTo-Json -Depth 3 # 指定足够深度确保嵌套结构序列化完整 try { $response = Invoke-RestMethod -Uri $Url -Method Post -Body $ApiBody -ContentType "application/json" $response } catch { Write-Error "请求失败:$_" }
额外注意事项
- 参数类型:API文档明确部分参数为布尔类型,建议使用
$false/$true而非字符串'false',避免格式兼容问题。 - JSON序列化深度:PowerShell的
ConvertTo-Json默认深度为2,嵌套层级超过2时需手动指定-Depth,否则会导致结构截断。 - 异常捕获:添加
try/catch可以查看API返回的具体错误信息,便于调试。
内容的提问来源于stack exchange,提问作者Morten Bach
相关产品推荐
相关产品推荐

