【问题标题】:How do i differentiate between two endpoints, each with one PathVariable?如何区分两个端点,每个端点都有一个 PathVariable?
【发布时间】:2021-06-29 09:04:25
【问题描述】:

我正在开发一个 Spring Boot 应用程序。我有以下 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}" })

但是有没有其他方法可以在不向路径添加任何内容的情况下解决它?

【问题讨论】:

    标签: java spring spring-boot rest endpoint


    【解决方案1】:

    路径变量通常类似于主键。

    喜欢:

    /person/{id}
    

    您尝试的是搜索数据,这应该使用查询参数来完成。

    例子:

    @GetMapping(value = { "/person/{name}", "/person/{age}" })
    public PersonData getPersonData(@RequestParam String name,
                                    @RequestParam Integer age) {
    
    }
    

    那你就可以调用它了

    /person?age=40
    /person?name=Peter
    

    【讨论】:

    • 好吧,假设他们的 ID 在哪里,然后呢?
    • 一个休息端点不能有两个不同的ID
    • 好的,知道了。非常感谢先生。
    • 欢迎您,如果有帮助请采纳我的回答
    • @SimonMartinelli 不将 {name} 和 {age} 视为路径变量吗?
    【解决方案2】:

    在您的情况下,我会让 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 可以从注释中省略,因为这是默认值,我使用它只是为了指出每个端点将仅针对该特定查询参数实现

    【讨论】:

      【解决方案3】:

      agename 在逻辑上是一回事;选择的最佳答案正确地建议将它们保留为可区分的参数。

      但是您可以检查该值是否为数字并将其视为age

      @GetMapping("/person/{value}")
      public String getPerson(@PathVariable String value) {
          if (value.matches("[0-9]|[0-9][0-9]"))
              return "Age";
          else
              return "Name";
      }
      

      但这是模棱两可且容易出错(例如,当添加其他数字参数时,您将如何区分 shoeSizenumberOfPartners?)。

      【讨论】:

        猜你喜欢
        • 2019-01-28
        • 2022-10-02
        • 2016-01-01
        • 2012-01-22
        • 1970-01-01
        • 2022-01-15
        • 1970-01-01
        • 1970-01-01
        • 2016-08-17
        相关资源
        最近更新 更多