如何在R的POST命令中传递拼接字符对象?Zyte调用报400错误
解决Zyte API调用400错误的问题
问题根源
你手动拼接JSON请求体时犯了两个关键错误:
- 变量
link.vec[i]对应的URL没有被双引号包裹,不符合JSON字符串的格式规范 - 给整个JSON内容套了外层单引号,导致请求体变成无效的JSON结构,被Zyte API拒绝
修复方案
推荐方案:用jsonlite生成合法JSON(彻底避免手动拼接出错)
直接构造R列表再转成JSON,自动处理引号、转义等格式问题,是最稳妥的方式:
library(httr) library(jsonlite) headers = c( `Content-Type` = "application/json" ) # 构造请求体的列表结构 request_body <- list( url = link.vec[i] ) # 转成合法的JSON字符串(auto_unbox确保单值不被转成数组) data <- toJSON(request_body, auto_unbox = TRUE) list_html.list[[i]] <- httr::POST( url = "https://api.zyte.com/v1/extract", httr::add_headers(.headers=headers), body = data, httr::authenticate("SPM-KEY", "") )
手动拼接的正确写法(不推荐,易出错)
如果一定要手动拼接,必须确保URL被双引号包裹,且不要加外层单引号:
headers = c( `Content-Type` = "application/json" ) # 给URL加上双引号后再拼接JSON结构 data = paste0('{ "url": "', link.vec[i], '" }') list_html.list[[i]] <- httr::POST( url = "https://api.zyte.com/v1/extract", httr::add_headers(.headers=headers), body = data, httr::authenticate("SPM-KEY", "") )
验证方法
打印data查看内容,确保和curl转换器生成的可用格式完全一致:
cat(data) # 正确输出示例: # {"url":"https://denver.craigslist.org/search/cta?bundleDuplicates=1&min_price=1000&postal=80003&purveyor=owner&search_distance=100#search=1~gallery~29~0"}
内容的提问来源于stack exchange,提问作者wjb_hwe
相关产品推荐
相关产品推荐

