user1828605
user1828605

Reputation: 1735

Is there a way to add optional parameter in API using R Plumber?

I have this routing that I'm trying to make it work:

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

This api is supposed to take the request with optional sn value. However, this is not working. The sn value may or may not exist and the query is ran based on this value. But when I run it, I keep getting this error:

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

0   "404 - Resource Not Found"

It only works if I also include the sn.

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

How can I make this parameter optional? Or will I have to create another function without this value?

Update

I updated the routing and the logic to attempt to correct for this issue.

#* @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 , "'")
  }
  ...

}

This is working for now but I have to still add NULL in the url. I'd love to hear a better way to do this.

Upvotes: 1

Views: 998

Answers (2)

user1828605
user1828605

Reputation: 1735

Base on @BrunoTremblay's response, I ended up converting function to use query instead of path. This worked fine.

The new function looks like this:

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

Upvotes: 0

Bruno Tremblay
Bruno Tremblay

Reputation: 776

Your path has three parameters and you are only providing 2. It works when you provided a third one but it is not mapped to sn. It is mapped to perspectiveID.

/outcomes-aggregate/categoryId:int//

Upvotes: 1

Related Questions