Rook webserver将postfields的内容解析为list的名称

时间:2016-03-03 15:31:25

标签: xml r post rcurl rook

我想将xml字符串发送到我的Rook网络服务器。但是,当我使用POST类的Rook::Request方法来解析请求的POST有效负载时,它会将内容放入返回列表的名称中。相应的列表值为NA。我使用postFormpostfields包的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之外,如何才能正确完成?我是否需要在RookRCurl

中设置选项

顺便说一句:

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

1 个答案:

答案 0 :(得分:0)

结果是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,因为只有通过一些黑客攻击才能使远程机器可以访问它(参见http://jeffreyhorner.tumblr.com/post/33814488298/deploy-rook-apps-part-ii)。这个黑客,BTW,对我不起作用。我现在正在使用plumber包 - 像魅力一样! (https://github.com/trestletech/plumber