0

我想向我的网络服务器发送一个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,如何正确完成?我需要在Rookor中设置选项RCurl吗?

顺便提一句:

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

1 回答 1

0

原来是Rook. 以 post 请求为例

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结构。这对于xmls 来说是有问题的,因为它们可以包含使用=符号的命名空间定义(在定义xml版本时也可能在其他情况下)。

无论如何,我转身离开,Rook因为它只能通过一些黑客来访问远程机器(参见http://jeffreyhorner.tumblr.com/post/33814488298/deploy-rook-apps-part-ii)。顺便说一句,这个黑客对我不起作用。我现在正在使用这个plumber包 - 就像一个魅力!(https://github.com/trestletech/plumber

于 2016-03-06T18:06:47.687 回答