使用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
相关产品推荐
相关产品推荐

