R调用API时使用jsonlite::read_json出现open.connection连接错误问题
问题原因
HTTP 206 Partial Content 状态码代表服务器返回了资源的部分片段。本次报错有两个核心触发原因:
- 目标站点对请求头做了校验,R默认的网络请求UA(用户代理)会被识别为非浏览器请求,触发站点返回分块的部分内容
jsonlite::read_json底层依赖R基础的open.connection函数,该函数不支持处理206状态的分块响应,会直接判定连接打开失败
解决方案
推荐使用httr包构造标准化HTTP请求,完美兼容各类响应场景,代码示例如下:
# 若未安装httr先执行安装 # install.packages("httr") library(tidyverse) library(jsonlite) library(httr) api_request <- "https://www.plazavea.com.pe/api/catalog_system/pub/products/search?fq=C:/678/687/&_from=21&_to=41&O=OrderByScoreDESC&" # 构造带浏览器UA的GET请求,绕过站点校验 resp <- GET( url = api_request, add_headers( `User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" ) ) # 校验请求状态,正常会返回success类状态 http_status(resp) # 方案1:直接用httr内置方法解析JSON product_data <- content(resp, as = "parsed") # 方案2:提取响应文本后用jsonlite解析,符合原有使用习惯 product_data <- fromJSON(content(resp, as = "text"))
备选方案(无需额外依赖httr)
如果不想引入新的依赖包,可以先将接口内容下载到本地再读取:
api_request <- "https://www.plazavea.com.pe/api/catalog_system/pub/products/search?fq=C:/678/687/&_from=21&_to=41&O=OrderByScoreDESC&" temp_json <- tempfile(fileext = ".json") # 下载时指定UA和二进制写入模式 download.file( url = api_request, destfile = temp_json, mode = "wb", headers = c(`User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") ) # 读取本地JSON文件 product_data <- read_json(temp_json) # 删除临时文件 unlink(temp_json)
内容的提问来源于stack exchange,提问作者Omar Gonzales
相关产品推荐
相关产品推荐

