服务端收到通过拦截器的请求后,第一步,即为对请求参数的合法性校验。
合法性校验依次为三部分:
- 参数是否存在
- 参数类型是否合法
- 其他复杂校验
请求校验
一般的参数校验举例如下:
如果采用如下方式接受传入参数,看起来好像可以解决校验臃肿的问题:
但是如果参数过多呢,列出所有传参,代码显示较多,而且耦合较高,无法复用。
统一提出为Model,使用validation校验,采用bean注入方式调用,使代码看起来不那么臃肿,层次分明,Model大多时候可以复用,如下所示:
|
|
有木有觉得很清爽~, 稍复杂的例子如下
提出前:
提出后:
|
|
若参数校验不合法,返回状态码400,出错时间,错误原因等详细信息,对接良好。
注意,若为post请求,可加上注解@ModelAttribute
若为get请求,仅注解@Valid即可
模拟单纯发http请求,不走浏览器,使用curl或者postman,curl可以看到请求的详细过程,postman图形界面且有历史记录,开发中推荐使用curl,两者皆可。
如以上的chargeList函数的参数校验,模拟请求:
请求格式统一提出Model,同样地,返回格式也可封装为类,替代Map,这块不多介绍,感兴趣的尝试一下。
扩展:validation注解详解
- @Null :元素必须为 null
- @NotNull :元素必须不为 null
- @AssertTrue :元素必须为 true
- @AssertFalse :元素必须为 false
- @Min(value) :元素必须是一个数字,其值必须大于等于指定的最小值
- @Max(value) :元素必须是一个数字,其值必须小于等于指定的最大值
- @DecimalMin(value) :元素必须是一个数字,其值必须大于等于指定的最小值,接受超出int长度的值,对应BigDecimal类型
- @DecimalMax(value) :元素必须是一个数字,其值必须小于等于指定的最大值
- @Size(max, min) :限制字符长度必须在min到max之间
- @Digits (integer, fraction) : 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
- @Past : 验证注解的元素值(日期类型)比当前时间早
- @Future : 限制必须是一个将来的日期
- @Pattern(value) :必须符合指定的正则表达式
- @Email :必须是电子邮箱地址,也可以通过正则表达式和flag指定自定义的email格式
- @Length(min=, max=) :字符串的大小必须在指定的范围内
- @NotEmpty :字符串必须非空
- @Range(min=, max=) :元素必须在合适的范围内
- @NotBlank :验证字符串非null,且长度必须大于0
注:@NotNull, @NotEmpty, @NotBlank 这3个注解的区别如下:
- @NotNull :任何对象的value不能为null
- @NotEmpty :集合对象的元素不为0,即集合不为空;也可用于字符串不为null且length大于0
- @NotBlank :只能用于字符串不为null,并且字符串trim()以后length要大于0
约束力度为:@NotBlank > @NotEmpty > @NotNull