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"))
}
Другие вопросы по тегам