使用R调用Companies House API遇400错误,请求技术协助
解决Companies House API调用400错误及后续数据框行数不匹配问题
核心问题分析
API返回Status:400属于客户端请求错误,这直接导致后续处理未获取到有效数据,进而触发arguments imply differing number of rows:1,0的报错。以下是针对性排查和解决步骤:
1. 查看API返回的具体错误信息
先获取400错误的详细描述,这是定位问题的关键:
# 在精简函数中添加该行代码查看错误详情 print(httr::content(firmTEST))
常见错误原因包括:API密钥无效、密钥权限不足、请求编码错误等。
2. 确保API密钥正确且权限正常
- 确认从Companies House开发者页面获取的密钥无复制错误(避免多余空格、换行符)
- 登录Companies House开发者后台,检查密钥是否处于激活状态,且拥有搜索API的访问权限
3. 优化请求URL的编码方式
手动替换特殊字符容易遗漏,改用R内置的URLencode()函数处理搜索关键词:
search_company <- function (company, mkey) { firmNAME <- URLencode(company, reserved = TRUE) # 替换手动gsub FIRMurl <- paste0("https://api.company-information.service.gov.uk/search/companies?q=",firmNAME) # 添加Accept头确保返回JSON格式 firmTEST <- httr::GET(FIRMurl, httr::authenticate(mkey, ""), httr::add_headers(Accept = "application/json")) # 先检查请求状态 if(httr::http_status(firmTEST)$category != "Success"){ stop("API请求失败:", httr::content(firmTEST)$error) } firmTEXT <- httr::content(firmTEST, as = "text") return(firmTEXT) }
4. 验证密钥认证格式
Companies House API要求用API密钥作为用户名,密码留空,确保httr::authenticate(mkey, "")的参数顺序正确(第一个参数是用户名,第二个是密码),不要搞反。
5. 修复原函数的数据框行数不匹配问题
当API请求失败返回空数据时,原函数会强制构造行数不匹配的数据框,建议在函数中增加请求状态检查,提前终止并抛出明确错误,避免后续模糊报错。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

