R plumber api 和通过 Curl 在 windows 中发送数据
R plumber api and data sending through Curl in windows
我需要使用 Windows 中的 Curl 将 CSV 文件发送到使用 plumber
API 中的 R 程序。我在 Windows 中安装了 Curl。
我已经尝试了以下方法,但它不起作用。我是 R 和 APIs 的新手,抱歉。
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)
}
有两个问题。首先,当 "form data" 通过 HTTP 发送时,它作为 key/value 对的序列发送。特别是,在 GET 请求中,它实际上嵌入在 URL 中。例如,在 URL:
https://www.google.com/intl/en/about/?fg=1&utm_source=google.com&...
key/value 对是 fg=1
、utm_source=google.com
等
当您编写 Plumber 代码时,函数采用与键相对应的参数,因此如果 Google 打算决定为其 "About" 页面部署 Plumber,他们可能会写:
#* @get /intl/en/about
function(fg, utm_source, etc) {
...
}
在您的代码中,您有 URL /data1
的水管工代码,它还需要包含 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.names
和 sep
被忽略的奇怪警告。此外,写入 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"))
}
我需要使用 Windows 中的 Curl 将 CSV 文件发送到使用 plumber
API 中的 R 程序。我在 Windows 中安装了 Curl。
我已经尝试了以下方法,但它不起作用。我是 R 和 APIs 的新手,抱歉。
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)
}
有两个问题。首先,当 "form data" 通过 HTTP 发送时,它作为 key/value 对的序列发送。特别是,在 GET 请求中,它实际上嵌入在 URL 中。例如,在 URL:
https://www.google.com/intl/en/about/?fg=1&utm_source=google.com&...
key/value 对是 fg=1
、utm_source=google.com
等
当您编写 Plumber 代码时,函数采用与键相对应的参数,因此如果 Google 打算决定为其 "About" 页面部署 Plumber,他们可能会写:
#* @get /intl/en/about
function(fg, utm_source, etc) {
...
}
在您的代码中,您有 URL /data1
的水管工代码,它还需要包含 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.names
和 sep
被忽略的奇怪警告。此外,写入 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"))
}