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

R语言API调用返回500 Internal Server Error问题排查求助

问题排查与修复方案

一、先修复代码语法错误

你提供的get_results函数存在明显的语法不完整问题:

  • 函数体最后缺少闭合的},且调用语句results <- get_results(headers, experiment_id, ontology)错误地写在了函数内部,这会导致R解析代码时出错,甚至干扰API请求的正常执行。
  • 修复后的完整代码结构如下:
get_results <- function(headers, experiment_id, ontology = "all") {
  get_drugs_for_results <- function(gene_prioritization) {
    cat("Extracting drugs for gene prioritization...\n")
    print(gene_prioritization)  # Debug: Inspect gene_prioritization content
    
    top_genes <- gene_prioritization$top_genes_configuration
    gene_symbols <- sapply(top_genes, function(x) x$gene_symbol)
    gene_symbols <- unique(gene_symbols)
    cat("Gene symbols to query for drugs:\n")
    print(gene_symbols)  # Debug: Print the gene symbols being queried
    
    response <- GET(
      paste0(url, "drugs"),
      add_headers(.headers = headers),
      query = list(genes = toJSON(gene_symbols))
    )
    cat("Response status code for drugs API:", status_code(response), "\n")
    
    if (status_code(response) == 200) {
      results <- fromJSON(rawToChar(response$content), encoding = "UTF-8")
      return(results$genesDrugs)
    } else {
      cat("Error in drugs API response:", status_code(response), content(response, "text", encoding = "UTF-8"), "\n")
      return(list())
    }
  }
  
  cat("-- Results of experiment with ID: ", experiment_id, " --\n")
  
  # Inspect headers and experiment_id before the request
  cat("Headers:\n")
  print(headers)
  cat("Experiment ID:\n")
  print(experiment_id)
  
  response <- GET(paste0(url, "results"),
                  add_headers(.headers = headers),
                  query = list(experimentId = experiment_id))
  
  cat("Response status code for results API:", status_code(response), "\n")
  cat("Response content:\n")
  print(content(response, "text", encoding = "UTF-8"))  # Debug: Print raw response content for inspection
  
  if (status_code(response) == 200) {
    results <- fromJSON(rawToChar(response$content), encoding = "UTF-8")
    status <- results$status
    cat("Experiment status:", status, "\n")
    # 可补充后续逻辑,比如调用get_drugs_for_results
    # 示例:if (status == "completed") { drugs <- get_drugs_for_results(results) }
  } else {
    cat("Error in results API response:", status_code(response), content(response, "text", encoding = "UTF-8"), "\n")
  }
}

# 函数调用移到函数外部
results <- get_results(headers, experiment_id, ontology)

二、消除"No encoding supplied: defaulting to UTF-8."提示

这个提示是因为fromJSON或content函数未显式指定编码,虽然默认UTF-8通常兼容,但显式指定即可消除提示:

  • 在fromJSON中添加encoding = "UTF-8"参数
  • 在content函数中同样添加encoding = "UTF-8"参数
    (参考上面修复后的代码示例)

三、排查"500 Internal Server Error"错误

500属于服务器内部错误,但客户端请求格式或参数问题也可能触发该错误,按以下步骤逐一排查:

  1. 验证请求URL拼接正确性:
    • 检查url变量是否以斜杠结尾,比如url为"https://your-api.com/"时,paste0(url, "results")会生成正确的"https://your-api.com/results";若url无斜杠,会变成无效的"https://your-api.comresults"。可在请求前打印完整URL确认:
      full_url <- paste0(url, "results")
      cat("Full request URL:", full_url, "\n")
      
  2. 确认请求头格式:
    • 确保headers是命名列表,且键名与API要求完全一致(注意大小写,比如api-key是否需要写成Api-Key),示例:
      headers <- list(
        `Content-Type` = "application/json",
        `api-key` = "your-valid-api-key"
      )
      
  3. 查看服务器端日志:
    • 自家API的服务器日志会记录500错误的具体原因,比如参数类型不匹配、数据库查询失败、权限问题等,这是最直接的排查方式。
  4. 手动模拟请求验证:
    • 使用curl命令或Postman工具手动调用API,排除代码问题:
      curl -H "Content-Type: application/json" -H "api-key: your-api-key" "https://your-api.com/results?experimentId=1234567890"
      
      若手动请求也返回500,说明问题出在服务器端;若手动请求成功,再回到代码排查差异。
  5. 检查闭包变量作用域:
    • 内部函数get_drugs_for_results使用了外部的url和headers变量,确保这些变量在调用get_results时处于有效作用域内,未被意外覆盖。

内容的提问来源于stack exchange,提问作者user3683485

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 13:10:55