![](/img/trans.png)
[英]Rest API Best Practices: Multiple parameters search filter API implementation
[英]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()
方法来获取所有请求参数。 我有几个问题:
HttpServletRequest
getParameterMap()
更好? 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
。
它是反模式的唯一原因是它是弱类型的。 您可能会说这是 Java 中的一种反模式,因为 Java 偏爱静态类型。
最好不要在你的 api 服务中注入 HttpServletRequest,因为 HttpServletRequest 最好只在 web 层使用。 让 spring 为您提供执行功能所需的数据是最好的方法,因为您不依赖于 HttpServletRequest 被设置为创建您的服务对象,因此如果您想测试您的服务,您可以传递字符串映射在测试而不是依赖 HttpServletRequest 对象进行单元测试时
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.