r-调用本地Rstudio中的API,将多个值作为一个变量的输入



我可以通过这个脚本成功地从本地Rstudio调用api:

该api发布在Domino数据标签中

library(httr)
library(rjson)
url <- "XXX"
response <- POST(
url,
authenticate("XXX", "XXX", type = "basic"),
body=toJSON(list(data=list( 
"product_list_Zone"= "ZONE 1", 
"product_list_brand"= "A1", 
"product_list_FY22SRP"=390,
"commodityPrice"= 415.59))),
content_type("application/json"))

然而,我希望每个";product_list_brand"以及";product_list_FY22SRP";。说,";product_list_brand"可以是A1和A2;product_list_FY22SRP";将是390(对应于A1(和400(对应于A2(。

我尝试过用"product_list_brand"= c("A1, A2")替换"product_list_brand"= "A1",但这不起作用。我也试过"product_list_brand"= toJSON(c("A1, A2")),但它仍然不起作用。

那么,我应该如何为每个"0"具有多个值的正确输出呢;product_list_brand"以及";product_list_FY22SRP";输入?我认为这是一个格式问题,我可以使用"product_list_brand"= c("A1, A2")成功地调用我的api函数(但不调用api,它不起作用(。

(有一件有趣的事情是,根据Domino datalab的例子,我必须在这里使用body=toJSON(list(data=list()))格式,到目前为止,使用其他格式会出现错误。(

提前感谢!

是否可以在参数中传递多个值完全由API端控制,与客户端无关。如果远程端不支持它,那么您唯一能做的就是使用单个值重复查询。

也许:

func <- function(url, bodies, ..., expand = FALSE) {
bodies <- if (expand) do.call(expand.grid, bodies) else as.data.frame(bodies)
bodies <- do.call(mapply, c(list(FUN = function(...) jsonlite::toJSON(list(data = list(...)))), bodies))
lapply(bodies, function(body) do.call(httr::POST, c(list(url = url, body = body), ...)))
}
func("XXX",
bodies = list("product_list_Zone" = "ZONE 1", "product_list_brand" = c("A1", "A2"),
"product_list_FY22SRP" = 390, "commodityPrice" = 415.59),
httr::authenticate("XXX", "XXX", type = "basic"),
httr::content_type("application/json"))

这应该总是返回一个list,每个元素都是对API的一次调用的结果。

expand=的唯一区别是,如果/当您提供多个多值参数时。例如,我将使用两个区域和两个品牌,并中断步骤以显示传递给func:的每个调用的body

cat(sep = "n",
func("XXX", bodies = list("product_list_Zone" = c("ZONE 1", "ZONE 2"), "product_list_brand" = c("A1","A2"), "product_list_FY22SRP" = 390, "commodityPrice" = 415.59), httr::authenticate("XXX", "XXX", type = "basic"), httr::content_type("application/json"))
)
# {"data":{"product_list_Zone":["ZONE 1"],"product_list_brand":["A1"],"product_list_FY22SRP":[390],"commodityPrice":[415.59]}}
# {"data":{"product_list_Zone":["ZONE 2"],"product_list_brand":["A2"],"product_list_FY22SRP":[390],"commodityPrice":[415.59]}}
cat(sep = "n",
func("XXX", bodies = list("product_list_Zone" = c("ZONE 1", "ZONE 2"), "product_list_brand" = c("A1","A2"), "product_list_FY22SRP" = 390, "commodityPrice" = 415.59), httr::authenticate("XXX", "XXX", type = "basic"), httr::content_type("application/json"), expand = TRUE)
)
# {"data":{"product_list_Zone":["ZONE 1"],"product_list_brand":["A1"],"product_list_FY22SRP":[390],"commodityPrice":[415.59]}}
# {"data":{"product_list_Zone":["ZONE 2"],"product_list_brand":["A1"],"product_list_FY22SRP":[390],"commodityPrice":[415.59]}}
# {"data":{"product_list_Zone":["ZONE 1"],"product_list_brand":["A2"],"product_list_FY22SRP":[390],"commodityPrice":[415.59]}}
# {"data":{"product_list_Zone":["ZONE 2"],"product_list_brand":["A2"],"product_list_FY22SRP":[390],"commodityPrice":[415.59]}}

对于expand=FALSE(默认值(,假设参数将";"再循环";(在R的意义上(自然:所有向量都是:

  • 长度1,因此重复了最长参数的长度
  • 长度n,最长自变量
  • n的某个整数除数的长度(边点:这是R循环的特征,我认为这不是一个合理的默认值…(

例如,data.frame(a=1, b=1:2, d=1:6)不会出错,并显示了以上三个规则。

然而,对于expand=TRUE,它使用expand.grid来查找所有参数的所有排列。

注意emptor:我没有用实际的API进行测试,所以POST功能可能需要一些调整。

最新更新