2016-03-03 32 views
0

我想發送一個xml字符串到我的Rook Web服務器。但是,當我使用Rook::Request類的POST方法來解析請求的有效負載時,它將內容放入返回列表的名稱中。相應的列表值是NA。我使用包的postFormpostfields選項來創建我的請求。下面更詳細的例子如下:Rook webserver將postfields的內容解析爲列表名稱

將這個到文件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") 

回答

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