You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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"))

错误原因分析

  1. 手动JSON转义冲突:你手动编写的JSON字符串里用了\"转义,但当把这个字符串传给encode="json"时,httr会再次对这些转义符进行转义,导致实际发送的JSON中键名变成\"location.footprint\",API无法识别这个参数,因此返回406错误提示“未指定位置”。
  2. 请求头缺失:部分注释的调用没有显式设置Content-Type: application/json,API无法判断请求体的格式,也会导致解析失败。

关键注意点

  • 永远优先用R原生对象(列表、向量)构造请求体,让jsonlite自动处理序列化,避免手动写JSON的转义错误。
  • 必须显式设置content_type_json(),确保API知道请求体是JSON格式,这是Postman默认会处理的环节,但R代码需要手动配置。

内容的提问来源于stack exchange,提问作者mweber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 14:45:43