Есть ли способ добавить необязательный параметр в API с помощью R Plumber?

#r #api #plumber

#r #API #водопроводчик

Вопрос:

У меня есть этот маршрут, который я пытаюсь заставить работать:

 #* @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 в URL. Я хотел бы услышать лучший способ сделать это.

Ответ №1:

Ваш путь содержит три параметра, и вы предоставляете только 2. Это работает, когда вы предоставили третий параметр, но он не сопоставлен с sn. Он отображается в perspectiveID.

/outcomes-aggregate/CategoryID:int//

Комментарии:

1. это полезно. Итак, у него должно быть то же имя, что указано в api. Но есть ли способ сделать его необязательным, чтобы он мог принимать либо 2, либо 3 параметра?

2. Я обновил вопрос, основываясь на том, что вы сказали о параметрах. Спасибо, что указали на это

3. Не для параметров пути, он может быть необязательным для параметра запроса localhost:3982/outcomes-aggregated /1 / 342342?sn = NULL

Ответ №2:

Основываясь на ответе @BrunoTremblay, я в конечном итоге преобразовал функцию для использования запроса вместо path. Это сработало нормально.

Новая функция выглядит следующим образом:

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