使用R的httr调用IPaC Location API返回406错误的问题
解决IPaC Location API调用返回406(Not Acceptable)的问题
你的问题核心是手动构造JSON字符串时的转义错误,加上请求头设置不当,导致API无法正确解析location.footprint参数。Postman能成功是因为它自动处理了JSON序列化和请求头,而R代码里的手动转义和请求配置出现了冲突。
修正后的代码
直接用R列表构造请求体,让httr和jsonlite自动处理JSON序列化,避免手动转义的问题:
library(httr) library(jsonlite) # 用R列表构建请求体,完全避免手动JSON转义 request_body <- list( "location.footprint" = list( coordinates = list( list( list(c(-95.1306152, 30.4486737), c(-93.6584473, 29.4061051), c(-94.6691895, 28.5314486), c(-96.5368652, 29.9834867), c(-95.1306152, 30.4486737)) ) ), type = "Polygon" ), timeout = 2, apiVersion = "1.0.0", includeOtherFwsResources = TRUE, includeCrithabGeometry = FALSE ) url <- 'https://ipacb.ecosphere.fws.gov/location/api/resources/' # 正确配置请求头并发送POST请求 r <- httr::POST( url = url, content_type_json(), # 明确指定Content-Type为application/json body = request_body, encode = "json" # 自动将R列表序列化为合法JSON ) # 查看响应结果 str(content(r, "parsed"))
错误原因分析
- 手动JSON转义冲突:你手动编写的JSON字符串里用了
\"转义,但当把这个字符串传给encode="json"时,httr会再次对这些转义符进行转义,导致实际发送的JSON中键名变成\"location.footprint\",API无法识别这个参数,因此返回406错误提示“未指定位置”。 - 请求头缺失:部分注释的调用没有显式设置
Content-Type: application/json,API无法判断请求体的格式,也会导致解析失败。
关键注意点
- 永远优先用R原生对象(列表、向量)构造请求体,让
jsonlite自动处理序列化,避免手动写JSON的转义错误。 - 必须显式设置
content_type_json(),确保API知道请求体是JSON格式,这是Postman默认会处理的环节,但R代码需要手动配置。
内容的提问来源于stack exchange,提问作者mweber
相关产品推荐
相关产品推荐

