如何在R的API循环调用中跟踪各请求的响应状态?
实现API批量调用的状态跟踪与结果记录
你可以通过以下方式修改代码,实现每个请求的状态跟踪,并生成包含PROTOCOL_ID、PROTOCOL_NO及响应状态的结果表:
核心修改思路
- 替换
purrr::walk为purrr::map_dfr——walk无返回值,map_dfr可将每个请求的结果合并为完整数据框 - 让函数接收数据集整行数据,直接获取
PROTOCOL_ID和PROTOCOL_NO,避免后续合并麻烦 - 用
tryCatch捕获请求过程中的异常(如网络错误、API返回无效数据) - 分别记录GET和PUT请求的状态码+状态描述,方便定位问题
修改后的完整代码
library(httr) library(purrr) library(jsonlite) library(tibble) token <- "12345" base <- "https://mywebsite.website.com" endpoint <- "/website-api/rest/protocolManagementDetails/" # 原数据集 df <- structure(list( PROTOCOL_ID = c(1, 22, 543, 421, 55, 6), PROTOCOL_NO = c("CTSU-E1234", "BRUOG-j-1234", "tp-P-bob61", "PFIZER-T", "Jimbo", "INCONGRUENCE"), LIBRARY = c("Non-Oncology", "Oncology", "Non-Oncology", "Oncology", "Oncology", "Non-Oncology") ), row.names = c(NA, 6L), class = "data.frame") UpdateAccountNumbers <- function(row) { protocol_id <- row$PROTOCOL_ID protocol_no <- row$PROTOCOL_NO api_url <- paste0(base, endpoint, protocol_id) # 初始化状态变量 get_status <- NA_character_ put_status <- NA_character_ tryCatch({ # 执行GET请求 get_response <- GET(api_url, add_headers(authorization = token)) get_status <- paste0(status_code(get_response), " ", http_status(get_response)$message) # 仅当GET请求成功返回200时,执行PUT更新 if (status_code(get_response) == 200) { response_data <- fromJSON(content(get_response, "text")) response_data$hospitalAccountNo <- response_data$internalAccountNo put_response <- PUT( api_url, add_headers(authorization = token), body = response_data, encode = "json" ) put_status <- paste0(status_code(put_response), " ", http_status(put_response)$message) } }, error = function(e) { # 捕获请求过程中的异常(如网络连接失败、JSON解析错误) get_status <- paste0("ERROR: ", e$message) }) # 返回当前行的结果记录 tibble( PROTOCOL_ID = protocol_id, PROTOCOL_NO = protocol_no, GET_Response = get_status, PUT_Response = put_status ) } # 执行批量调用并生成结果表 result_table <- map_dfr(df, UpdateAccountNumbers) # 查看最终结果 print(result_table)
代码说明
- 状态记录:每个请求的状态会以
状态码 状态描述的形式记录(如204 No Content、400 Bad Request),异常情况会直接记录错误信息 - 异常防护:
tryCatch块可以捕获网络故障、API返回非JSON数据等意外,避免批量调用中途中断 - 高效执行:只有当GET请求成功获取数据(状态码200)时,才会执行PUT更新,减少无效请求
- 结果输出:最终的
result_table包含PROTOCOL_ID、PROTOCOL_NO、GET请求状态、PUT请求状态四个字段,可直接用于后续分析或问题排查
内容的提问来源于stack exchange,提问作者Joe Crozier
相关产品推荐
相关产品推荐

