有没有一种方法可以使用R Plumber在API中添加可选参数?

时间:2020-08-20 00:01:14

标签: r api plumber

我正在尝试执行以下路由:

#* @get /outcomes-aggregate/<categoryId:int>/<classId>/<perspectiveID>/<sn>
#* @serializer unboxedJSON
function(res, req, categoryId, classId,sn=NULL){
  
  ## initialization
  query <- NULL
  data_to_send <- list()
  ...
}

api应该以可选的sn值接收请求。但是,这不起作用。 sn值可能存在或可能不存在,并且基于该值运行查询。但是当我运行它时,我不断收到此错误:

call: http://localhost:3982/outcomes-aggregated/1/342342

0   "404 - Resource Not Found"

只有在我还包含sn的情况下,它才有效。

call: http://localhost:3982/outcomes-aggregated/1/342342/NULL

如何使此参数可选?还是我必须创建另一个没有该值的函数?

更新

我更新了路由和逻辑以尝试解决此问题。

#* @get /outcomes-aggregate/<categoryId:int>/<classId>/<sn>
#* @serializer unboxedJSON
function(res, req, categoryId, classId,sn=NULL){
  
  ## initialization
  query <- NULL
  data_to_send <- list()
  ...

   if(missing(sn) || pracma::strcmp(sn, "NULL")){
    query <- paste0("SELECT * FROM classes WHERE classID = '", classId, "'")
  } else{
    query <- paste0("SELECT * FROM classes WHERE classID = '", classId, "' and sn = '", sn , "'")
  }
  ...

}

目前该方法有效,但是我仍然必须在网址中添加NULL。我很想听听这样做的更好方法。

2 个答案:

答案 0 :(得分:1)

您的路径有3个参数,您只提供2个。当您提供第三个参数时,它可以工作,但未映射到sn。它已映射到PerspectiveID。

/ outcomes-aggregate / categoryId:int //

答案 1 :(得分:0)

基于@BrunoTremblay的响应,我最终将函数转换为使用查询而不是路径。效果很好。

新功能如下:

#* @get /outcomes-aggregate <-- remove the path
#* @serializer unboxedJSON
function(res, req, categoryId, classId,sn=NULL){
  
  ## initialization
  query <- NULL
  data_to_send <- list()
  ...
}