Как передать параметр curl -F в пакете httr? - PullRequest
0 голосов
/ 24 ноября 2018

Привет, я пытаюсь перевести эту инструкцию curl, используя httr

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 голосов
/ 25 ноября 2018

Вот как построить этот запрос curl с пакетом httr.Я использовал 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())
...