#r #json #curl #plumber
#r #json #curl #водопроводчик
Вопрос:
Я использовал Plumber (https://github.com/trestletech/plumber ) создать веб-API для исходного кода R, целью которого является обработка json_string в качестве входных данных и преобразование его в R dataframe.
R-код:
#* @param data
#* @post /predict
jsonToDF <- function(data) {
library(jsonlite)
dat <- fromJSON(data)
}
Как вы можете видеть из приведенного выше кода, я использую библиотеку jsonlite
и fromJSON()
метод.
Затем я предоставил сервис локально через:
library(plumber)
r <- plumb("code.R")
r$run(port=54321)
Я использовал запрос curl:
curl -v -i -X POST -H "Content-Type: application/json" --data "testData='{"a":"b"}'" http://localhost:54321/predict
чтобы отправить json_string ( {"a":"b"}
), но это ошибка, которую я получил:
<simpleError: lexical error: invalid char in json text.
'{"a":"b"}'
(right here) ------^
Я использовал R console для двойной проверки правильности ввода, и я не получил то же сообщение об ошибке.
> z <- fromJSON('{"a":"b"}')
> z
$a
[1] "b"
Кто-нибудь может объяснить мне, почему это работает в консоли R, но не в качестве входных данных в поле данных запросов curl? Большое вам спасибо!
Комментарии:
1. Пожалуйста, добавьте свой код R, сообщение об ошибке и вывод на консоль в виде текста . помните, что после добавления вы можете отформатировать его, добавив 4 пробела перед каждой строкой или нажав Control K
2. @Julio Я внес необходимые изменения, спасибо за ваши предложения. Надеюсь, теперь проблема прояснилась.
3. Почему у вас есть
testData=
часть в ваших данных? Похоже, что на это имя нигде нет ссылок.4. @MrFlick ах, спасибо, что указали на это, это была просто оплошность с моей стороны при копировании кода в процессе разработки этого вопроса
Ответ №1:
Мне удалось получить желаемый ввод, изменив "data='{"a":"b"}'"
на "data={"a":"b"}"
. Я просто удалил одинарные кавычки из поля —data команды curl .
Я думаю, что R автоматически обрабатывается {"a":"b"}
как строка после получения ее от curl, поэтому мне не нужно было явно объявлять ее как '{"a":"b"}'
при отправке через curl.