SpringBoot写后端接口,看这一篇就够了
文章插图
前言:
一个后端接口大致分为四个部分组成:接口地址(url)、接口请求方式(get、post等)、请求数据(request)、响应数据(response) 。 如何构建这几个部分每个公司要求都不同 , 没有什么“一定是最好的”标准 , 但一个优秀的后端接口和一个糟糕的后端接口对比起来差异还是蛮大的 , 其中最重要的关键点就是看是否规范!
本文就一步一步演示如何构建起一个优秀的后端接口体系 , 体系构建好了自然就有了规范 , 同时再构建新的后端接口也会十分轻松 。
所需依赖包这里用的是SpringBoot配置项目 , 本文讲解的重点是后端接口 , 所以只需要导入一个spring-boot-starter-web包就可以了:
本文还用了swagger来生成API文档 , lombok来简化类 , 不过这两者不是必须的 , 可用可不用 。
参数校验一个接口一般对参数(请求数据)都会进行安全校验 , 参数校验的重要性自然不必多说 , 那么如何对参数进行校验就有讲究了 。
业务层校验首先我们来看一下最常见的做法 , 就是在业务层进行参数校验:
public String addUser(User user) {if (user == null || user.getId() == null || user.getAccount() == null || user.getPassword() == null || user.getEmail() == null) {return "对象或者对象字段不能为空";}if (StringUtils.isEmpty(user.getAccount()) || StringUtils.isEmpty(user.getPassword()) || StringUtils.isEmpty(user.getEmail())) {return "不能输入空字符串";}if (user.getAccount().length() < 6 || user.getAccount().length() > 11) {return "账号长度必须是6-11个字符";}if (user.getPassword().length() < 6 || user.getPassword().length() > 16) {return "密码长度必须是6-16个字符";}if (!Pattern.matches("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$", user.getEmail())) {return "邮箱格式不正确";}// 参数校验完毕后这里就写上业务逻辑return "success"; }
这样做当然是没有什么错的 , 而且格式排版整齐也一目了然 , 不过这样太繁琐了 , 这还没有进行业务操作呢光是一个参数校验就已经这么多行代码 , 实在不够优雅 。
我们来改进一下 , 使用Spring Validator和Hibernate Validator这两套Validator来进行方便的参数校验!这两套Validator依赖包已经包含在前面所说的web依赖包里了 , 所以可以直接使用 。
Validator + BindResult进行校验Validator可以非常方便的制定校验规则 , 并自动帮你完成校验 。 首先在入参里需要校验的字段加上注解,每个注解对应不同的校验规则 , 并可制定校验失败后的信息:
@Datapublic class User {@NotNull(message = "用户id不能为空")private Long id;@NotNull(message = "用户账号不能为空")@Size(min = 6, max = 11, message = "账号长度必须是6-11个字符")private String account;@NotNull(message = "用户密码不能为空")@Size(min = 6, max = 11, message = "密码长度必须是6-16个字符")private String password;@NotNull(message = "用户邮箱不能为空")@Email(message = "邮箱格式不正确")private String email;}校验规则和错误提示信息配置完毕后 , 接下来只需要在接口需要校验的参数上加上@Valid注解 , 并添加BindResult参数即可方便完成验证:@RestController@RequestMapping("user")public class UserController {@Autowiredprivate UserService userService;@PostMapping("/addUser")public String addUser(@RequestBody @Valid User user, BindingResult bindingResult) {// 如果有参数校验失败 , 会将错误信息封装成对象组装在BindingResult里for (ObjectError error : bindingResult.getAllErrors()) {return error.getDefaultMessage();}return userService.addUser(user);}}
- 80Gbps带宽!DP2.0接口因疫情延期:第一代显示器下半年见
- LG发布首款4K 160Hz显示器27GP950:IPS面板、HDMI 2.1接口
- 「小狮子诊所」买SSD该选SATA接口还是M.2的?
- 脑机接口发展失控,人类或将成为变形金刚,马斯克也很无奈
- 375W喂不饱:技嘉给RTX 3080悄悄增加了一个供电接口
- 接口|DP接口不比HDMI差甚至还免费 为何电视厂商不用?
- 阿里达摩院发布2021十大科技趋势,人类有望借脑机接口超越生物学极限
- 不换接口、开放内存超频,11代酷睿平台更厚道了
- 银欣推出MS12金属移动硬盘盒:采用20Gbps USB-C接口
- 计算机专业的同学在掌握了Java之后,还可以学习哪门后端语言