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

使用httr2上传已存在文件时,如何提取curl状态码?

使用httr2上传文件时提取服务器内部警告状态码

问题背景

我正在用R包httr2向SAS的LSAF 5.4.2环境上传文件,遇到以下问题:

  • 当目标文件已存在时,服务器返回HTTP状态码200("OK"),但文件并未实际更新
  • 通过req_perform(req, verbosity=3)的调试输出能看到curl返回的警告信息"code":20012,"type":"WARNING",但这个状态码没有包含在resp对象中,无法程序化校验上传结果
  • 改用httr包时,可以通过content(response)$status$code获取到20012这个警告码,但我希望继续使用httr2

当前的httr2上传代码:

url <- "<server URL><Filepath on server>?action=upload"

req <- request(url) %>%
  req_method("POST") %>%
  req_headers("X-Auth-Token" = token) %>%
  req_body_multipart(uploadFile = curl::form_file(file_path))
resp <- req_perform(req, verbosity=3)

执行后返回的HTTP状态:

> resp_status(resp)
[1] 200
> resp_status_desc(resp)
[1] "OK"

而使用httr时可以获取内部状态码:

response <- PUT(
  url,
  add_headers(`X-Auth-Token` = token),
  body = list(uploadFile = upload_file(file_path))
)
> response$status
[1] 200
> content(response)$status$code
[1] 20012

注:我知道可以在URL后追加&overwrite=true自动覆盖文件,但不想这么做;另外服务器仅接受PUT方法,之前用POST是测试,实际会改用PUT。

解决方案:解析响应体提取内部状态码

在httr2中,你可以通过resp_body_json()函数解析服务器返回的JSON响应体,直接获取内部状态码,和httr的content()函数逻辑一致。

修改后的代码如下:

url <- "<server URL><Filepath on server>?action=upload"

# 改用服务器要求的PUT方法
req <- request(url) %>%
  req_method("PUT") %>%
  req_headers("X-Auth-Token" = token) %>%
  req_body_multipart(uploadFile = curl::form_file(file_path))
resp <- req_perform(req)

# 解析响应体为JSON格式,提取内部状态码
resp_content <- resp_body_json(resp)
internal_code <- resp_content$status$code

# 根据内部状态码处理不同场景
if (internal_code == 20012) {
  warning("文件已存在,未执行更新操作")
} else if (internal_code == 200) { # 假设成功的内部状态码为200,请根据实际情况调整
  message("文件上传成功")
}

关键说明

  • resp_body_json()会将服务器返回的JSON响应转为R列表,直接访问$status$code即可拿到内部状态码,无需依赖调试输出
  • 代码中已将请求方法改为PUT,匹配服务器要求
  • 可以根据实际的内部状态码规则,扩展更多判断逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:58:28