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。
根据 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。