R中fromJSON直读URL的JSON报‘Undefined index: dgLanguage’错,本地解析同内容正常
R 环境下远程JSON读取异常问题
基础测试配置
本次测试使用的目标URL定义如下:
url_bbmp <- "http://accounts.bbmpgov.in/PublicView/vss00CvStatusData.php?pAction=LoadPaymentGridData&pCriteria=&pDateFrom=01-Jan-1900&pDateTo=01-Jan-1900&pDateType=pDF&pOrderBy=-1&pFinancialYearID=-1&pBudgetHeadID=-1&pDDOIDs=&pWardIDs=&pDateFilterYN=false&pWardID=174&filterscount=0&groupscount=0&pagenum=0&pagesize=2&recordstartindex=0&recordendindex=2&_=1614505598778#"
复现现象
- 浏览器直接粘贴该URL访问时,可正常返回格式合规的大段JSON文本
- R环境下直接调用
jsonlite::fromJSON(url_bbmp)读取URL内容时,会收到服务端返回的PHP类型错误:
$rError
[1] "Undefined index: dgLanguage"
对照验证
将浏览器加载得到的JSON文本单独保存为本地文件raw_publicview.txt后,R环境下执行以下解析代码均可正常运行:
- 统计JSON长度:
可正常输出结果189jsonlite::read_json("raw_publicview.txt") %>% length() - 转换为数据框统计行数:
同样可正常输出结果189fromJSON(readLines("raw_publicview.txt",warn = F)) %>% as.data.frame %>% nrow()
以上验证可证明JSON内容本身不存在格式问题。
异常原因说明
触发该报错的核心是R直接发起的HTTP请求和浏览器发起的请求,在请求上下文上存在差异:
- 该接口对应的后端页面使用了dhtmlxGrid类前端表格组件,代码中会直接读取会话Cookie里的
dgLanguage字段做语言匹配;因为后端代码没有对该字段做存在性判断,当请求没有携带对应Cookie时,就会抛出PHP层面的“未定义索引”报错。 - 浏览器直接访问该URL时,会自动携带之前访问站点公共页面时种下的会话Cookie(其中包含dhtmlxGrid组件自动生成的
dgLanguage键值),因此服务端能正常识别请求并返回合规JSON。 jsonlite::fromJSON直接读取URL时,底层发起的是无会话的裸HTTP请求,不会自动携带站点的会话Cookie,缺少了后端校验必需的dgLanguage字段,因此触发报错。
解决思路
- 不要直接依赖
fromJSON内置的URL读取功能,改用支持自定义请求头、Cookie的HTTP包(如httr)模拟浏览器请求流程:先访问站点首页获取会话Cookie,再携带匹配浏览器的请求头向目标URL发起请求,将拿到的响应文本传入fromJSON做解析。 - 可通过浏览器开发者工具,复制目标请求的完整请求头、Cookie配置,导入到R的HTTP请求参数中,匹配服务端的校验规则。
内容的提问来源于stack exchange,提问作者Lazarus Thurston
相关产品推荐
相关产品推荐

