R 管道工不解析 json 个参数

R plumber not parsing json arguments

根据 plumber docs,我应该能够以 JSON 格式传递函数参数。给定以下服务器:

#* Return the sum of two numbers
#* @param a The first number to add
#* @param b The second number to add
#* @post /sum
function(a, b) {
  as.numeric(a) + as.numeric(b)
}

如果我然后启动服务器:

library(plumber)
library(dplyr)
pr("plumber.R") %>%
     pr_run(port=8000)

这按预期工作:

curl --data "a=4&b=3" "http://localhost:8000/sum"
[7]

但这不起作用,尽管上面链接的文档似乎说明它应该:

curl --data '{"a":4, "b":5}' http://localhost:8000/sum

我得到的错误是:

<simpleError in (function (a, b) {    as.numeric(a) + as.numeric(b)})(): argument "a" is missing, with no default>

谁能发现我做错了什么?

这是我的 sessionInfo:

R version 4.0.2 (2020-06-22)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Catalina 10.15.6

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] plumber_1.0.0.9999

loaded via a namespace (and not attached):
 [1] compiler_4.0.2      magrittr_2.0.1      R6_2.5.0            later_1.1.0.1      
 [5] promises_1.1.1.9001 tools_4.0.2         swagger_3.33.1      yaml_2.2.1         
 [9] Rcpp_1.0.5          stringi_1.5.3       jsonlite_1.7.2      webutils_1.1       
[13] httpuv_1.5.4        lifecycle_0.2.0     rlang_0.4.9.9000   

我认为管道工文档有错误。它说:

You can also send your data as JSON:

$ curl --data '{"a":4, "b":5}' http://localhost:8000/sum`

但我认为它应该是:

$ curl -H "Content-Type: application/json" --data '{"a":4, "b":5}' http://localhost:8000/sum`

在你的情况下,你还应该确保添加 -X POST,因为你使用 #* @post /sum.

在您的(非 R)命令行上试试这个:

curl -X POST -H "Content-Type: application/json" --data '{"a":4, "b":5}' http://localhost:8000/sum

解释:

Error: argument "a" is missing, with no default 出错的原因是因为输入解析器通常在寻找 "a=4&b=3" 的模式。值得注意的是,name=value,除其他外,json 内容中没有 = 它可能能够找到内容。

(在我看来,我认为严格执行输入格式是好的。如果它记录一些说“无法解析的内容类型”的东西会更好,但那是不同的抱怨。)

https://github.com/rstudio/plumber/issues/691

文档需要更新 curl。