Выбор конечной точки API REST в Spring Boot
Учитывая контроллер, как это:
@RestController
@RequestMapping("/cars") {
public class CarController{
@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<List<Cars>> getCars() { //logic }
@RequestMapping(method = RequestMethod.GET")
public ResponseEntity<List<Cars>> searchCar(@RequestParam("name") String name, @RequestParam("value") String value) { //logic}
}
Если URL-адрес похож на этот localhost / cars, я хотел бы получить доступ к методу getCars().
Но если URL-адрес: localhost/cars? Имя = что-то и значение =100 или
localhost / cars? name = что-то или
локальный / машины? значение =100
Я хотел бы, чтобы второй метод был доступен.
Возможно ли это сделать?
2 ответа
Вы все еще запрашиваете тот же список ресурсов, машин, только вы добавляете фильтр или критерии поиска / запроса.
Было бы полезно разработать фильтр / критерии запроса для поддержки чего-то вроде:
/cars?q=make+eq+acura (meaning make=acura)
/cars?q=price+lt+25000 (meaning price <25000)
и так далее.
Нет, это невозможно. потому что, когда запрос поступает в контейнер, он сначала сканирует все URL и проверяет уникальность URL. Если присутствует повторяющийся URL-адрес, то контейнер выдаст исключение.
В вашем случае вы используете сопоставление URL на уровне класса, но не используете сопоставление URL на уровне метода.
Чтобы получить доступ к вашему getCars()
метод, вам нужно использовать какой-то URL, как показано ниже
@RequestMapping(value = "/", method = RequestMethod.GET)
Для доступа ко второму способу вам нужно использовать другой URL-адрес сопоставления
@RequestMapping(values="/test", method = RequestMethod.GET")
Вы не можете получить доступ
localhost/cars?name=something&value=100 or
localhost/cars?name=something or
localhost/cars?value=100
так как вы используете 2 параметра, как @RequestParam("name") String name, @RequestParam("value") String value
вам нужно передать два параметра в вашем URL, как показано ниже
localhost/cars/test?name=something&value=100
если вы не хотите передавать какой-либо из двух параметров, просто передайте его как null
и проверьте это внутри вашего метода