R Plumber API和通过Windows中的Curl发送数据

时间:2018-08-18 07:50:01

标签: r csv curl plumber

我需要使用plumber API将Windows中使用Curl的CSV文件发送到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"]}

我的R plumber代码是:

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

1 个答案:

答案 0 :(得分:1)

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

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

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

在编写Plumber代码时,这些函数将采用与键相对应的参数,因此,如果Google打算为其“关于”页面决定部署Plumber,它们可能会编写:

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

在您的代码中,您具有URL /data1的Plumber代码,该代码也需要包含CSV内容的data1密钥:

#* @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"))
}