我想将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")
答案 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)