【问题标题】:Filters in the GET requestGET 请求中的过滤器
【发布时间】:2021-02-19 18:35:07
【问题描述】:

在 GET 请求中实现过滤器的最佳方式是什么?

假设有一种方法可以获取 id 等于 1 的用户:/user?id=1

如果您需要处理很多类似的过滤器/user? id=1&name=Sam&...,不一定都会使用。实现处理的最佳方式是什么?

@GetMapping("/user")
public String getUser(@RequestParam("name", required=false) String name) {
    // ...
}

【问题讨论】:

    标签: java spring get


    【解决方案1】:

    如果您遵循 REST 约定,则不会将标识符添加为查询参数,而是添加为路径参数。 (/users/1)

    回到拥有多个查询参数,您有一些选择。

    如您所说,有多个 RequestParams 和 required=false 选项。

    @GetMapping("/user")
    public String getUser(@RequestParam(required=false) String firstName,
                          @RequestParam(required=false) String lastName,
                          @RequestParam(required=false) String nickName,
                          @RequestParam(required=false) String mail,
                          @RequestParam(required=false) String sex) {
        // ...
    }
    

    另一种选择是使用 Java8 Optional

    @GetMapping("/user")
    public String getUser(@RequestParam Optional<String> String firstName,
                          @RequestParam Optional<String> String lastName,
                          @RequestParam Optional<String> String nickName,
                          @RequestParam Optional<String> String mail,
                          @RequestParam Optional<String> String sex) {
        // ...
    }
    

    但是,如果您有多个搜索选项,最好的方法是将 GET 请求转换为 POST 请求,在搜索对象中传递所有搜索选项。您可以在 GET 请求中传递请求正文,但它可能会被某些库/服务器忽略,因此不建议这样做。

    @PostMapping
    public String getUser(@RequestBody UserSearchRequest searchRequest) {
        // ...
    }
    

    【讨论】:

    • 以及如何在方法中进一步处理它们,因为某些参数可能会丢失?写一个 if-s 链对我来说似乎不太合适。
    • 如果您的查询足够智能,您就不必使用一堆 if 语句。如果您有很多移动部件的查询,其他选项可能是 JPA Criteria API
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多