Multipart / form-данные с RestRserve - PullRequest
       10

Multipart / form-данные с RestRserve

2 голосов
/ 17 марта 2020

Я хотел бы предоставить конечную точку, которая принимает multipart / form-data, анализирует составное содержимое и возвращает csv-файл. (многокомпонентный ввод содержит набор данных csv и инструкции по обработке)

Я сделал это с сантехником, используя Rook::Multipart$parse(), как предложено здесь . Поскольку сантехник не поддерживает параллельные запросы, я хотел бы повторно реализовать это с помощью RestRserve. Следующее не будет работать - входные данные сантехника класса environment (что предполагает Rook::Multipart$parse()), тогда как входные данные RestRserve относятся к классу Request R6.

application = Application$new(content_type = "text/plain")
application$add_post("/echo", function(req, res) {
  multipart <- Rook::Multipart$parse(req$body)
  dta <- read_csv(multipart$dta$tempfile, trim_ws=FALSE)
  res$set_body(dta)
})

Любые идеи о том, как получить multipart / form ввода данных для работы с RestRserve?

1 Ответ

2 голосов
/ 19 марта 2020

RestRserve анализирует составное тело при обработке входящего запроса. В результате у вас есть необработанные request$body и метаданные в request$files. Объект Request также предоставляет метод get_file для извлечения содержимого тела. Позвольте мне показать пример для приложения и запроса:

# load packages
library(readr)
library(callr)
library(httr)

# run RestRserve in the background
ps <- r_bg(function() {
  library(RestRserve)
  library(readr)

  app = Application$new(content_type = "text/plain")
  app$add_post(
    path = "/echo",
    FUN = function(request, response) {
      # for debug
      str(request$body)
      str(request$files)
      # extract multipart body field
      cnt <- request$get_file("csv") # 'csv' from the upload form field
      # parse CSV
      dt <- read_csv(cnt)
      # for debug
      str(dt)
      # do something with dt
      identity(dt)
      # write result to temp file
      tmp <- tempfile()
      write_csv(dt, tmp)
      # set output body
      response$set_body(c(tmpfile = tmp))
      # or simply response$set_body(format_csv(dt))
    }
  )

  backend = BackendRserve$new()
  backend$start(app, http_port = 65080)
})

# wait for up
Sys.sleep(2L)

# check is alive
ps$is_alive()

# prepare CSV to upload
tmp <- tempfile()
write_csv(head(iris, 5), tmp)

# POST request with file
rs <- POST(
  url = "http:/127.0.0.1:65080/echo",
  body = list(csv = upload_file(tmp)),
  encode = "multipart"
)
# get response content
cat(content(rs))

# read log from the RestRserve
cat(ps$read_output())

# kill background prcoess
ps$kill()

См. ?Request для более подробной информации о полях и методах в этом классе.

...