0

我想使用 R Web 服务器包 Rook 获取 POST 请求正文的原始文本。

我已经注册了 R 应用程序:

parsePOST <- function(env) {
  request <- Rook::Request$new(env)

  body <- request$body()
  print(body)
}

R.server$add(app = parsePost, name = "reportGeneratorApp")

不幸的是,body是一个Rook::RhttpdInputStream. 我尝试过的事情:

  1. 这仅提供第一行:
    body <- request$body()$read_lines()
    结果:
    {\n

  2. 这仅提供正文的开头,而与“Content-Length”标头无关。所有其他读取行都是character(0). 此外,这些行在随机位置缺少数据。
    body <- request$body()$read_lines(10)
    结果:

   [2] " \"data\": {\n   "                                                                                                                        
   [3] "evious\": [\n      2\n    ],\n    \"v"                                                                                                    
   [4] "e\": {\n        \"Differentially private me"                                                                                              
   [5] "              \"values\": [\n                44.39"                                                                                       
   [6] "an mechanismLaplace\"\n              ],\n              \"arguments\": ["                                                                  
   [7] "         },\n            \"batch\": [\n              1\n            ]\n          }\n    "                                                 
   [8] "\n            ]\n          }\n        }\n      },\n      \"educ_income\": {\n        \"ols\": {\n          \"ols0\": {\n            \"rel"
   [9] ""                                                                                                                                         
  [10] ""                                                                                                                                         

POST 请求由邮递员发送,标题为Content-Type: application/json

我很惊讶地发现检索请求正文如此困难。

4

1 回答 1

0

我能够使用以下内容将正文提取为字符串:

writeLines(paste0(rawToChar(request$body()$read(), multiple = T), collapse=""))

read()方法返回字节,我将每个字节解析成一个字符向量,然后折叠该字符向量。如果有人有更简单或更清洁的方法来做到这一点,请分享。

于 2019-06-13T18:29:24.513 回答