繁体   English   中英

带有所有请求参数的 Java REST API - 最佳实践

[英]Java REST API with all request parameters - best practices

我定义了一个 REST GET API,它将获取所有请求参数并根据请求参数的值返回结果。 像下面这样:

@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public List<Student> findAll(@RequestParam Map<String, String> allRequestParams) {
    if(allRequestParams.isEmpty()) {
        return studentRepository.findAll();
    } else {
       return studentService.findWithFilter(allRequestParams); // This method will take care of using appropriate findBy method on the repository
    }
}

上面的代码是使用 Spring 的方式来检索所有的请求参数。 我可以改为注入HttpServletRequest并使用getParametersMap()方法来获取所有请求参数。 我有几个问题:

  1. 使用 Spring 方式还是使用HttpServletRequest getParameterMap()更好?
  2. 我在其中一个代码审查中被告知这种编程是反模式的? 有人可以解释为什么它被认为是反模式吗? 如果是反模式,那么处理这种处理的最佳方法是什么?
  1. Spring方式更好,因为它更方便。 您想要使用HttpServletRequest的唯一原因是,如果您只想将代码绑定到非供应商 API。 既然您已经在使用 Spring,那么您不妨充分利用它。

    您可能需要考虑使用自己的对象来保存请求参数。 这使其他开发人员可以更轻松地查看您的 API 支持哪些查询参数。 IE

     @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) public List<Student> findAll(@RequestParam MyQueryObject allRequestParams) { ... }

    Spring 会将查询参数映射到MyQueryObject的字段上,如果不可能,则会向客户端返回合理的错误消息。 Spring 还将基于Accept -header 来确定错误消息的格式,以便期望application/json客户端获得该text/html ,期望text/html客户端获得该text/html

  2. 它是反模式的唯一原因是它是弱类型的。 您可能会说这是 Java 中的一种反模式,因为 Java 偏爱静态类型。

最好不要在你的 api 服务中注入 HttpServletRequest,因为 HttpServletRequest 最好只在 web 层使用。 让 spring 为您提供执行功能所需的数据是最好的方法,因为您不依赖于 HttpServletRequest 被设置为创建您的服务对象,因此如果您想测试您的服务,您可以传递字符串映射在测试而不是依赖 HttpServletRequest 对象进行单元测试时

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM