You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R的API循环调用中跟踪各请求的响应状态?

实现API批量调用的状态跟踪与结果记录

你可以通过以下方式修改代码,实现每个请求的状态跟踪,并生成包含PROTOCOL_ID、PROTOCOL_NO及响应状态的结果表:

核心修改思路

  1. 替换purrr::walk为purrr::map_dfr——walk无返回值,map_dfr可将每个请求的结果合并为完整数据框
  2. 让函数接收数据集整行数据,直接获取PROTOCOL_ID和PROTOCOL_NO,避免后续合并麻烦
  3. 用tryCatch捕获请求过程中的异常(如网络错误、API返回无效数据)
  4. 分别记录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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:15:35