Spring 引导中的 REST API 端点选择

REST API endpoint selection in 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?name=something&value=100 或

localhost/cars?name=something 或

localhost/cars?值=100

我想访问第二种方法。

这可以吗?

不,这是不可能的。因为当请求到达容器时,它将首先扫描所有 URL 并检查 URL 的唯一性。如果存在重复的 URL,则容器将抛出异常。

在您的情况下,您正在使用 class 级别 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 传递并在您的方法中检查它

您仍在请求相同的资源列表,汽车,唯一的问题是您正在添加过滤器或搜索/查询条件。

开发一个查询过滤器/标准来支持类似的东西会很有帮助:

/cars?q=make+eq+acura (meaning make=acura)
/cars?q=price+lt+25000  (meaning price <25000)

等等。