使用httr2处理Qualtrics API错误失败:响应非JSON格式
解决httr2中Qualtrics API错误响应的通用获取方法
要实现始终获取错误文本且无需关注响应类型,可以通过自定义错误处理逻辑结合httr2内置的字符串解析函数来解决,以下是具体方案:
1. 自定义错误处理,保留响应对象
不要完全关闭错误判断(is_error = \(resp) FALSE),而是自定义错误处理规则:在检测到错误状态码(≥400)时,不直接终止请求,而是保留响应对象并提取错误内容。示例代码:
library(httr2) # 自定义错误处理函数:捕获错误但返回响应对象 req_custom_error <- function(req) { req_error(req, # 仅将状态码≥400的请求标记为错误 is_error = \(resp) resp_status(resp) >= 400, # 自定义错误消息,包含响应内容 message = \(resp) paste0("API请求错误: ", resp_status(resp), " - ", resp_body_string(resp)) ) } # 构建并执行请求 req_get_users <- request("https://fra1.qualtrics.com/API/v3/users") |> req_method("POST") |> req_oauth_client_credentials(client = oauth_client(id = "my_id", secret = "my_secret", token_url = "https://fra1.qualtrics.com/oauth2/token"), scope = "manage:all", token_params = list("grant_type" = "client_credentials")) |> req_custom_error() |> req_perform()
2. 通用提取错误文本的规范方法
使用httr2提供的resp_body_string()函数替代rawToChar(resp_body_raw()),它会自动处理编码和不同响应类型的转换,无需关心响应是JSON、HTML还是其他文本格式:
# 提取错误文本 error_text <- resp_body_string(req_get_users)
3. 进阶:根据响应类型解析错误内容
如果需要针对不同响应类型做结构化解析,可以先判断内容类型再处理:
parse_error <- function(resp) { if (resp_status(resp) >= 400) { content_type <- resp_content_type(resp) # 优先解析JSON格式错误 if (grepl("application/json", content_type)) { return(resp_body_json(resp)) } else { # 其他类型直接返回文本 return(resp_body_string(resp)) } } return(NULL) } # 使用示例 parse_error(req_get_users)
方案优势
- 相比直接关闭错误检测,自定义
is_error逻辑更严谨,不会忽略错误状态 resp_body_string()是httr2官方推荐的文本解析方式,比手动处理raw更规范可靠- 既满足「返回响应对象」的需求,又能灵活提取完整错误信息
内容的提问来源于stack exchange,提问作者deschen
相关产品推荐
相关产品推荐

