如何在httr包中传递curl -F参数?

时间:2018-11-24 18:47:23

标签: r curl rcurl httr

嗨,我尝试使用httr转换curl指令

curl -H "Authorization: Token f2210dacd9c6ccb8133606d94ff8e61d99b477fd" -F file=@test.txt -F filename=test.txt -F parent_dir=/ http://cloud.seafile.com:8082/upload-api/73c5d117-3bcf-48a0-aa2a-3f48d5274ae3

如果没有-F参数,则说明是:

httr::POST(
  url = "http://cloud.seafile.com:8082/upload-api/73c5d117-3bcf-48a0-aa2a-3f48d5274ae3",
  add_headers(Authorization = "Token f2210dacd9c6ccb8133606d94ff8e61d99b477fd")
  )
)

我认为我必须使用httr::upload_file函数,但是我没有错误地使用它。

您知道我该怎么做吗?

致谢

1 个答案:

答案 0 :(得分:1)

这里是如何使用httr包构造此curl请求。我使用httpbin.org测试发送的请求。

您将使用POST用列表填充正文。 encode参数控制此列表的处理方式,默认情况下,它是您需要的正确multipart

res <- httr::POST(
  url = "http://httpbin.org/post",
  httr::add_headers(Authorization = "Token f2210dacd9c6ccb8133606d94ff8e61d99b477fd"),
  # Add the file and metadata as body using a list. Default encode is ok
  body = list(
    file = httr::upload_file("test.txt"),
    filename = "test.txt",
    parent_dir = "/"
  )
)

httr_ouput <- httr::content(res)

一种可以检查的方法是将输出与您知道正在运行的curl命令进行比较

out <- sys::exec_internal(
       'curl -H "Authorization: Token f2210dacd9c6ccb8133606d94ff8e61d99b477fd" -F file=@test.txt -F filename=test.txt -F parent_dir=/ http://httpbin.org/post'
    )
curl_output <- jsonlite::fromJSON(rawToChar(out$stdout))

#compare body

identical(curl_output$files, httr_ouput$files)
#> TRUE
identical(curl_output$form, httr_ouput$form)
#> TRUE

您还可以使用Crul包装(卷曲上方的另一个包装纸)进行包装;逻辑是相同的

con <- crul::HttpClient$new(
  url = "http://httpbin.org/post"
)

crul_req <- con$post(
  body = list(
    file = crul::upload("test.txt"),
    filename = "test.ext",
    parent_dir = "/"
  )
)

crul_output <- jsonlite::fromJSON(crul_req$parse())