R сантехник API и отправка данных через Curl в Windows
Мне нужно отправить файл CSV с помощью Curl в Windows в программу R, используя plumber
API. У меня есть Curl установлен в Windows.
Я попробовал следующее, но это не работает. Я новичок в R и API, извините.
Команда Curl в Windows:
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"]}
Мой р plumber
код является:
#* @get /data1
function(data1) {
write.csv(data1, file="Final_Test.csv", sep=",", row.names=FALSE,
col.names=TRUE)
}
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 /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
и укажите его в URL-адресе для запроса GET), вам нужно использовать немного другую командную строку, чем вы используете:
curl -X GET --data-urlencode 'data1@C:\Users\hp\Document\Final_Training.csv'
http://localhost:8000/data1
Это должно получить данные, фактически отправленные в процесс сантехника. На стороне 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"))
}