使用httr2发送请求:含嵌套JSON的请求体触发HTTP 400错误
排查Google Maps Places API新版Text Search中locationBias参数导致的HTTP 400错误
出现这个问题的核心原因几乎都是locationBias参数的格式或传递方式不符合API要求,下面是具体的排查方向和解决方法:
1. 错误传递嵌套List而非JSON字符串
httr2的req_body_form()默认会将List类型参数拆分为多键值对(比如把list(circle=list(center=...))解析成locationBias[circle][center][latitude]=37.7749这类格式),但Google Places API要求locationBias是完整的JSON字符串,而非拆解后的表单字段。
错误示例:
# 直接传嵌套List会导致参数格式混乱 req <- request("https://places.googleapis.com/v1/places:searchText") %>% req_auth_bearer_token("YOUR_API_KEY") %>% req_body_form( query = "coffee shops", locationBias = list(circle = list(center = list(latitude = 37.7749, longitude = -122.4194), radius = 1000)) )
正确写法:
用jsonlite::toJSON()把嵌套结构转为标准JSON字符串,注意开启auto_unbox = TRUE避免多余的数组括号:
library(jsonlite) # 生成符合要求的locationBias JSON字符串 location_bias <- toJSON( list(circle = list(center = list(latitude = 37.7749, longitude = -122.4194), radius = 1000)), auto_unbox = TRUE ) req <- request("https://places.googleapis.com/v1/places:searchText") %>% req_auth_bearer_token("YOUR_API_KEY") %>% req_body_form( query = "coffee shops", locationBias = location_bias )
2. 请求内容类型与参数格式不匹配
新版Places API的Text Search支持两种请求体格式:
application/x-www-form-urlencoded(即req_body_form()):此时locationBias必须是JSON字符串application/json(即req_body_json()):此时locationBias直接传嵌套List,但整个请求体是JSON结构
如果混用两种格式(比如用req_body_json()但参数结构错误),也会触发400错误。
正确的JSON请求体写法(可选):
req <- request("https://places.googleapis.com/v1/places:searchText") %>% req_auth_bearer_token("YOUR_API_KEY") %>% req_body_json( list( query = "coffee shops", locationBias = list(circle = list(center = list(latitude = 37.7749, longitude = -122.4194), radius = 1000)) ) )
3. 参数结构或拼写错误
检查locationBias的结构是否严格符合API要求:
- 拼写是否正确:是
locationBias(驼峰式,B大写),不是locationbias或其他变体 - circle结构必须包含:
center(含latitude和longitude数字字段)、radius(数字,单位米) - 不要出现多余字段,比如把
longitude写成long这类拼写错误
4. 排查工具:查看实际请求内容
用httr2的req_dry_run()打印出发送的请求详情,对比官方示例确认参数是否正确:
req_dry_run(req)
重点检查locationBias的格式是否和官方curl示例一致(官方示例中locationBias是完整的JSON字符串,无额外转义)。
内容的提问来源于stack exchange,提问作者trevi
相关产品推荐
相关产品推荐

