我如何区分两个端点,每个端点都有一个 PathVariable?
How do i differentiate between two endpoints, each with one PathVariable?
我正在开发 Spring 启动应用程序。我有以下 REST 端点:
@GetMapping(value = { "/person/{name}", "/person/{age}" })
public PersonData getPersonData(@PathVariable(required = false) String name,
@PathVariable(required = false) Integer age) {
}
可以使用名称变量或年龄变量调用此端点,但看起来无法区分它们。如果我调用'.../person/20',它不会调用“/person/{age}”,但它总是调用“/person/{name}”。
我知道我可以做类似的东西:
@GetMapping(value = { "/person/name/{name}", "/person/age/{age}" })
但是有没有其他方法可以在不向路径添加任何内容的情况下解决它?
路径变量通常类似于主键。
喜欢:
/person/{id}
您尝试的是搜索数据,这应该使用查询参数来完成。
示例:
@GetMapping(value = { "/person/{name}", "/person/{age}" })
public PersonData getPersonData(@RequestParam String name,
@RequestParam Integer age) {
}
然后就可以调用了
/person?age=40
/person?name=Peter
age
和 name
在逻辑上 不是 同一事物;选择的最佳答案正确地建议将它们保留为可区分的参数。
但是您可以检查该值是否为数字并将其视为 age
、
@GetMapping("/person/{value}")
public String getPerson(@PathVariable String value) {
if (value.matches("[0-9]|[0-9][0-9]"))
return "Age";
else
return "Name";
}
但这是模棱两可且容易出错的(例如,添加其他数字参数时如何区分 shoeSize
或 numberOfPartners
?)。
在您的情况下,我会制作 2 个不同的端点以更加清晰,每个端点都需要提供自己的查询参数。
@GetMapping(value = "/person")
public PersonData getPersonDataByName(@RequestParam(required = true) String name) {
....
}
@GetMapping(value = "/person")
public PersonData getPersonDataByAge(@RequestParam(required = true) Integer age) {
....
}
required = true
可以从注释中省略,因为这是默认值,我用它只是为了指出每个端点将仅针对该特定查询参数实现
我正在开发 Spring 启动应用程序。我有以下 REST 端点:
@GetMapping(value = { "/person/{name}", "/person/{age}" })
public PersonData getPersonData(@PathVariable(required = false) String name,
@PathVariable(required = false) Integer age) {
}
可以使用名称变量或年龄变量调用此端点,但看起来无法区分它们。如果我调用'.../person/20',它不会调用“/person/{age}”,但它总是调用“/person/{name}”。
我知道我可以做类似的东西:
@GetMapping(value = { "/person/name/{name}", "/person/age/{age}" })
但是有没有其他方法可以在不向路径添加任何内容的情况下解决它?
路径变量通常类似于主键。
喜欢:
/person/{id}
您尝试的是搜索数据,这应该使用查询参数来完成。
示例:
@GetMapping(value = { "/person/{name}", "/person/{age}" })
public PersonData getPersonData(@RequestParam String name,
@RequestParam Integer age) {
}
然后就可以调用了
/person?age=40
/person?name=Peter
age
和 name
在逻辑上 不是 同一事物;选择的最佳答案正确地建议将它们保留为可区分的参数。
但是您可以检查该值是否为数字并将其视为 age
、
@GetMapping("/person/{value}")
public String getPerson(@PathVariable String value) {
if (value.matches("[0-9]|[0-9][0-9]"))
return "Age";
else
return "Name";
}
但这是模棱两可且容易出错的(例如,添加其他数字参数时如何区分 shoeSize
或 numberOfPartners
?)。
在您的情况下,我会制作 2 个不同的端点以更加清晰,每个端点都需要提供自己的查询参数。
@GetMapping(value = "/person")
public PersonData getPersonDataByName(@RequestParam(required = true) String name) {
....
}
@GetMapping(value = "/person")
public PersonData getPersonDataByAge(@RequestParam(required = true) Integer age) {
....
}
required = true
可以从注释中省略,因为这是默认值,我用它只是为了指出每个端点将仅针对该特定查询参数实现