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)
等等。
给定这样的控制器:
@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)
等等。