Веб-сервер Rook анализирует содержимое почтовых полей в имя списка

Я хочу отправить строку xml на свой веб-сервер Rook. Но когда я использую метод POST класса Rook::Request для анализа полезной нагрузки POST моего запроса, он помещает содержимое в имя возвращаемого списка. Соответствующее значение списка равно NA. Я использую postForm и параметр postfields пакета RCurl для создания своих запросов. Ниже приведен более подробный пример:

Поместите это в файл webserver.R

library(Rook)

s <- Rhttpd$new()

#set up web server app
s$add(
  name="xml_example",
  app=function(env) {
    req <- Request$new(env)

    #parse POST request
    tmp=req$POST()

    #create response
    res <- Rook::Response$new()

    #use dput and capture.output to return text of tmp
    res$write(capture.output(dput(tmp)))
    res$finish()
  }
)

#start web server on port 9000
s$start(port=9000)
#we will start the web server via Rscript and NOT via RStudio
Sys.sleep(.Machine$integer.max)

Следующее может быть выполнено через RStudio (пользователю Windows может потребоваться изменить некоторые команды)

library(RCurl)

#start web server outside of RStudio! Do not forget to kill it later
system("Rscript webserver.R &")

#send POST request
postForm("http://127.0.0.1:9000/custom/xml_example",
         .opts=list(postfields="<request>test</request>",
                    httpheader=c("content-type"="application/xml")))

Это возвращает

#[1] "structure(list(`<request>test</request>` = NA),
#                    .Names = \"<request>test</request>\")"

Как видите, в название списка вставлена ​​строка xml. Не совсем то, что я ожидал. Помимо извлечения имени списка для получения xml, как это можно сделать правильно? Нужно ли устанавливать параметры в Rook или RCurl?

КСТАТИ:

#do not forget to kill the webserver
system("ps aux|grep webserver.R")
#system("kill yourPIDhere")

person cryo111    schedule 03.03.2016    source источник


Ответы (1)


Оказалось, что это ошибка синтаксического анализа/функция в Rook. Возьмем, к примеру, почтовый запрос

postForm("http://127.0.0.1:9000/custom/xml_example",
         .opts=list(postfields="xml=<request>test</request>",
                    httpheader=c("content-type"="application/xml")))

Это дает результат

#[1] "structure(list(xml = \"<request>test</request>\"), .Names = \"xml\")"

Как видите, анализатор Rook предполагает некую key=value структуру входных данных. Это проблематично для xml, поскольку они могут включать определения пространств имен, использующие знак = (также при определении версий xml и, возможно, в других случаях).

В любом случае, я отказался от Rook, так как его можно сделать доступным для удаленных машин только с помощью некоторого взлома (см. " rel="nofollow">http://jeffreyhorner.tumblr.com/post/33814488298/deploy-rook-apps-part-ii). Этот хак, кстати, у меня не работает. Сейчас я использую пакет plumber - работает как шарм! (https://github.com/trestletech/plumber)

person cryo111    schedule 06.03.2016