0

我需要在 Windows 中使用 Curl 将 CSV 文件发送到使用plumberAPI 的 R 程序。我在 Windows 中安装了 Curl。

我尝试了以下方法,但它不起作用。我是 R 和 API 的新手,抱歉。

Windows 上的 Curl 命令:

curl -X GET -d '@C:\Users\hp\Document\Final_Training.csv'
       http://localhost:8000/data1

给出错误:

"error":["500 - Internal server error"],"message":["Error in is.data.frame(x):
argument \"data1\" is missing, with no default\n"]}

我的 Rplumber代码是:

#* @get /data1
function(data1) {
  write.csv(data1, file="Final_Test.csv", sep=",", row.names=FALSE, 
            col.names=TRUE)
}
4

1 回答 1

1

有两个问题。首先,当通过 HTTP 发送“表单数据”时,它是作为键/值对序列发送的。特别是,在 GET 请求中,它实际上嵌入在 URL 中。例如,在 URL 中:

https://www.google.com/intl/en/about/?fg=1&utm_source=google.com&...

键/值对是fg=1,utm_source=google.com等。

当您编写 Plumber 代码时,函数采用与键对应的参数,因此如果 Google 决定为他们的“关于”页面部署 Plumber,他们可能会这样写:

#* @get /intl/en/about
function(fg, utm_source, etc) {
    ...
}

在您的代码中,您有 URL 的 Plumber 代码,/data1该代码还需要一个data1包含 CSV 内容的键:

#* @get /data1         <-- the URL
function(data1) {      <-- which expects a `?data1=...` query parameter
  write.csv(data1, file="Final_Test.csv", sep=",", row.names=FALSE, 
            col.names=TRUE)
}

要让 Curl 执行此操作(使用密钥提供文件中的数据data1并提供在 GET 请求的 URL 中编码的数据),您需要使用与您使用的命令行稍有不同的命令行:

curl -X GET --data-urlencode 'data1@C:\Users\hp\Document\Final_Training.csv'
       http://localhost:8000/data1

那应该将数据实际发送到 Plumber 进程。在 Windows 端,您应该看到一个空的 Javascript 对象{}响应(所以没有错误)。在 R 端,您会看到一些关于尝试设置col.namessep被忽略或其他东西的奇怪警告。此外,写入的Final_Test.csv内容不是正确的 CSV 文件。

这就引出了第二个问题。在您的管道工代码中,data1将作为包含 CSV 文件内容的纯字符串接收。它不会是数据框或类似的东西。如果您只想将上传的文件写入 CSV 文件,您只需将字符串data1直接写入文件:

function(data1) {
    cat(data1, file="Final_Test.csv")
}

如果要将其加载到数据框中,则需要使用以下内容将字符串解析为 CSV 文件:

#* @get /data1
function(data1) {
    t <- textConnection(data1)
    X <- read.csv(t)
    close(t)
    print(summary(X))
    list(result=jsonlite::unbox("success"))
}
于 2018-08-19T16:41:26.660 回答