一、前言
一个后端接口大致分为四个部分组成: 接口地址(url)、接口请求方式(get、post等)、请求数据(request)、响应数据(response) 。虽然说后端接口的编写并没有统一规范要求,而且如何构建这几个部分每个公司要求都不同,没有什么“一定是最好的”标准,但其中最重要的关键点就是看是否规范。
二、环境说明
因为讲解的重点是后端接口,所以需要导入一个spring-boot-starter-web包,而lombok作用是简化类,前端显示则使用了knife4j,具体使用在spring boot整合knife4j实现api文档已写明。另外从springboot-2.3开始,校验包被独立成了一个starter组件,所以需要引入如下依赖:
org.springframework.boot spring-boot-starter-validation com.github.xiaoymin knife4j-spring-boot-starter 2.0.2 org.springframework.boot spring-boot-starter-web org.projectlombok lombok true三、参数校验
1、介绍一个接口一般对参数(请求数据)都会进行安全校验,参数校验的重要性自然不必多说,那么如何对参数进行校验就有讲究了。一般来说有三种常见的校验方式,我们使用了最简洁的第三种方法
业务层校验validator + bindresult校验validator + 自动抛出异常业务层校验无需多说,即手动在java的service层进行数据校验判断。不过这样太繁琐了,光校验代码就会有很多
而使用validator+ bindingresult已经是非常方便实用的参数校验方式了,在实际开发中也有很多项目就是这么做的,不过这样还是不太方便,因为你每写一个接口都要添加一个bindingresult参数,然后再提取错误信息返回给前端(简单看一下)。
@postmapping(/adduser)public string adduser(@requestbody @validated user user, bindingresult bindingresult) { // 如果有参数校验失败,会将错误信息封装成对象组装在bindingresult里 list2、validator + 自动抛出异常(使用)内置参数校验如下:
首先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注解(去掉bindingresult后会自动引发异常,异常发生了自然而然就不会执行业务逻辑):
@restcontroller@requestmapping(user)public class validationcontroller { @autowired private validationservice validationservice; @postmapping(/adduser) public string adduser(@requestbody @validated user user) { return validationservice.adduser(user); }}现在我们进行测试,打开knife4j文档地址,当输入的请求数据为空时,validator会将所有的报错信息全部进行返回,所以需要与全局异常处理一起使用。
// 使用form data方式调用接口,校验异常抛出 bindexception// 使用 json 请求体调用接口,校验异常抛出 methodargumentnotvalidexception// 单个参数校验异常抛出constraintviolationexception// 处理 json 请求体调用接口校验失败抛出的异常@exceptionhandler(methodargumentnotvalidexception.class)public resultvo
3、分组校验和递归校验分组校验有三个步骤:
定义一个分组类(或接口)在校验注解上添加groups属性指定分组controller方法的@validated注解添加分组类public interface update extends default{}@datapublic class user { @notnull(message = 用户id不能为空,groups = update.class) private long id; ......}@postmapping(update)public string update(@validated({update.class}) user user) { return success;}如果update不继承default,@validated({update.class})就只会校验属于update.class分组的参数字段;如果继承了,会校验了其他默认属于default.class分组的字段。
对于递归校验(比如类中类),只要在相应属性类上增加@valid注解即可实现(对于集合同样适用)
4、自定义校验spring validation允许用户自定义校验,实现很简单,分两步:
自定义校验注解编写校验者类@target({ method, field, annotation_type, constructor, parameter, type_use })@retention(runtime)@documented@constraint(validatedby = {havenoblankvalidator.class})// 标明由哪个类执行校验逻辑public @interface havenoblank { // 校验出错时默认返回的消息 string message() default 字符串中不能含有空格; class?[] groups() default { }; class? extends payload[] payload() default { }; /** * 同一个元素上指定多个该注解时使用 */ @target({ method, field, annotation_type, constructor, parameter, type_use }) @retention(runtime) @documented public @interface list { notblank[] value(); }}public class havenoblankvalidator implements constraintvalidator { @override public boolean isvalid(string value, constraintvalidatorcontext context) { // null 不做检验 if (value == null) { return true; } // 校验失败 return !value.contains( ); // 校验成功 }}
Surface Phone有望尝鲜微软的全屏指纹生物识别技术
物联网需要无线与控制的双轮驱动
令人惊叹的计算能力,最佳的GPU产品组合
用于量子光子学的高质量氧化铜晶体的合成方法
盘点总结全球规模最大最成功的云计算服务公司
SpringBoot 后端接口规范(上)
GigaSite将解决新时代移动宽带的容量需求
联发科正式发布了商用级5G芯片方案
液晶拼接大屏幕被干扰的原因-静电
人工智能的优缺点 人工智能的利与弊
[图文]全互补对称功放电路
千年大计、逐梦雄安丨软通动力子公司鸿湖万联与雄安集团达成战略合作
洁牙仪防水测试机的方案以及洁牙仪防水检测要点
最受欢迎的PCB检查方法概述
AI人工智能发展前景怎么样
618哪个电视值得入手?OPPO K9电视不容错过
IBM物联网战略:专攻云端IoT 不做装置
通过测试仪器防水透气膜来实现设备的散热与压差平衡
苹果希望以生物识别打造专用健康芯片
苹果向媒体发出邀请函,邀请他们参加3月25日举行的一次发布会