API参数如何验证?别纠结,拿去用就是
今天我们主要分享项目实战中,另一种常用的参数校验框架 Hibernate Validator,请准备好小板凳,我们的分享开始。
1.
是啥?
先抛一张图,锻炼一下你的观察力。
通过上图有没有发现,数据校验可谓是贯穿所有的应用程序层(从表示层到持久层),而通常在每一层要实现相同的验证逻辑,这样既耗时又容易出错。
那再抛一张图,欢迎大家一起来找茬(结合上幅图)。
我们会发现,为了避免每层进行重复的数据验证,可以将验证逻辑直接捆绑到域模型中,将域类与验证代码混淆。
有点意思,你可能会有点懵,莫急!你就简单认为在你的实体类属性上加点校验规则,但是这些校验规则到底该怎么加呢?
这不在 JSR380-Bean Validation 2.0 中为实体和方法验证定义元数据模型和API,是不是又茫然啦,啥是 JSR?啥是JSR380?
为了以后再见到内心不发虚,我们再解释一下。
JSR 是 Java 界的一个重要标准,是 Java Specification Requests 的缩写,意思是 Java 规范提案,任何人都可以提交 JSR ,以向 Java 平台增添新的 API 和服务。
JSR380-Bean Validation 2.0 是 Java 定义的一套最新的数据校验规范。
说了这么多,只有规范没有实现,一切都是扯淡。别急,该我们的大猪蹄子 Hibernate Validator 登场了。
那 Hibernate Validator 到底是啥?一句话说清楚:Hibernate Validator 是 JSR 380 数据校验规范的一种实现。
到这,你多多少少应该了解 JSR、JSR 380、Hibernate Validator。
好了,光耍嘴皮子,不干活那是码农中的流氓,也是时候真刀真枪的操练起来了。
2.
咋用?
第一步:引入依赖包。不用太纠结,用就完了。
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.17.Final</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b09</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator-cdi</artifactId>
<version>6.0.17.Final</version>
</dependency>
</dependencies>
第二步:定义登录请求对象,添加校验规则。主要关注注解即可,So easy!!
import javax.validation.constraints.*;
public class UserLoginRequest {
@NotNull(message = "[接口版本号]不能为空!")
@Pattern(regexp = "^(\\d+)(\\.\\d+)?$", message = "[接口版本号]格式错误!")
@Size(min = 0, max = 4, message = "[接口版本号]长度错误,最大长度为[{max}]!")
private String versionNo;
@NotNull(message = "[手机号]不能为空!")
@Size(min = 0, max = 11, message = "[用户手机号码]长度错误,最大长度为[{max}]!")
private String mobile;
@NotNull(message = "[订单号]不能为空!")
@Size(min = 0, max = 32, message = "[订单号]长度错误,最大长度为[{max}]!")
private String orderId;
@NotNull(message = "[验证码]不能为空!")
@Size(min = 0, max = 6, message = "[验证码]长度错误,最大长度为[{max}]!")
private String smsCode;
//TODO 提供setter/getter ... ...
}
第三步:按照常规,应该写个测试类,跑跑看,这次咱们就一步到位,直接封装工具类。你可以直接拿到真实项目去实践,用良心保证绝对好用。
import javax.validation.*;
import java.util.*; public class ValidateUtil { public static <T> void validate(T t) {
if (null == t) {
throw new ValidateException("E0001", "参数为空");
} ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<T>> constraintViolations = validator.validate(t); List<String> errorList = new ArrayList<String>();
for (ConstraintViolation<T> constraintViolation : constraintViolations) {
errorList.add(constraintViolation.getMessage());
}
if (!errorList.isEmpty()) {
throw new ValidateException("E9999", errorList.toString());
}
}
}
第四步:自定义异常,这个根据实际情况而定,非必须。
public class ValidateException extends RuntimeException {
private String code;
private String msg;
/**
* @param code 异常码
* @param msg 异常消息
*/
public ValidateException(String code, String msg) {
super(msg);
this.setCode(code);
this.setMsg(msg);
}
//TODO 提供setter/getter ... ...
}
第五步:跑起来,看一看是否经得起考验。
public class App {
public static void main(String[] args) {
UserLoginRequest request = new UserLoginRequest();
request.setVersionNo("abc"); //版本号输入错误
request.setMobile("138013800000"); //手机号长度有误
try {
ValidateUtil.validate(request);
} catch (ValidateException e) {
//TODO 在实际业务中直接获取异常码、异常信息进行包装返回给前端即可
System.out.println(String.format("code: %s, msg:%s",e.getCode(),e.getMsg()));
}
}
}
第六步:结果分析,看到结果,果真达到预期:手机号码长度错误、接口版本号格式有误、其它参数值传入为空。
3.
技术无止境,剩下的还需要各位自行去耕耘,不过掌握上面这些,已经够你在项目中喝一壶的啦。
好了,通过这次正规军式的分享 + 上次野战军式的分享,相信你今后肯定能玩转 API 参数校验,也就可以专心去写业务代码啦,如果你之前尚未接触过这些,不妨拿去实践,大概率会大幅提升你的研发效率,腾出更多时间喝咖啡,幸福感陡然上升。

API参数如何验证?别纠结,拿去用就是的更多相关文章
- .Net Core Web Api使用模型验证验证参数合法性
在接口开发过程中免不了要去验证参数的合法性,模型验证就是帮助我们去验证参数的合法性,我们可以在需要验证的model属性上加上Data Annotations特性后就会自动帮我们在action前去验证输 ...
- 徒手生撸一个验证框架,API 参数校验不再怕!
你们之中大概率早已练就了代码的拷贝.粘贴,无敌的码农神功,其实做久了业务功能开发,练就这两个无敌神功,那是迟早的事儿.今天先抛一个小问题,来打通你的任督二脉,就是很好奇的问一下:业务功能开发中,输入参 ...
- ABP(现代ASP.NET样板开发框架)系列之17、ABP应用层——参数有效性验证
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之17.ABP应用层——参数有效性验证 ABP是“ASP.NET Boilerplate Project (ASP. ...
- 细说 Web API参数绑定和模型绑定
今天跟大家分享下在Asp.NET Web API中Controller是如何解析从客户端传递过来的数据,然后赋值给Controller的参数的,也就是参数绑定和模型绑定. Web API参数绑定就是简 ...
- ABP应用层——参数有效性验证
ABP应用层——参数有效性验证 基于DDD的现代ASP.NET开发框架--ABP系列之17.ABP应用层——参数有效性验证 ABP是“ASP.NET Boilerplate Project (ASP. ...
- Parameter Binding in ASP.NET Web API(参数绑定)
Parameter Binding in ASP.NET Web API(参数绑定) 导航 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnbl ...
- SpringBoot2.0针对请求参数@RequestBody验证统一拦截
title: "SpringBoot2.0针对请求参数@RequestBody验证的统一拦截"categories: SpringBoot2.0 Shirotags: Spring ...
- golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息
golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...
- .net core Web API参数绑定规则
参数推理绑定 先从一个问题说起,微信小程序按照WebAPI定义的参数传递,Get请求服务器端可以正常接收到参数,但是Post请求取不到. Web API代码(.netcore 3.1)如下: [Htt ...
随机推荐
- 聊聊CAS - 面试官最喜欢问的并发编程专题
什么是CAS 学习Java并发编程,CAS(Compare And Set)机制都是一个不得不掌握的知识点.除了通过synchronized进行并发控制外,还可以通过CAS的方式控制,大家熟悉的Ree ...
- 使用java程序jxl操作Excel表格
在实际开发中企业办公系统都会涉及到一个打印报表的功能,也许你的需求就是把web前端展示的员工信息以Excel表格形式打印出来 ,那么具体怎么操作下面我来实现一下 首先我们使用的是 java的jxl技术 ...
- AB实验的高端玩法系列4- 实验渗透低?用户未被触达?CACE/LATE
CACE全称Compiler Average Casual Effect或者Local Average Treatment Effect.在观测数据中的应用需要和Instrument Variable ...
- 黑科技神器-uTools
Hello,各位小伙伴们好,又到周末了,小黑哥给大家分享一款神器:『utools』. 官网地址:https://u.tools/ uTools 是一个极简.插件化.跨平台的现代桌面软件.通过自由选配丰 ...
- Redis05——Redis Cluster 如何实现分布式集群
前面一片文章,我们已经说了Redis的主从集群及其哨兵模式.本文将继续介绍Redis的分布式集群. 在高并发场景下,单个Redis实例往往不能满足业务需求.单个Redis数据量过大会导致RDB文件过大 ...
- docker的安装,自己写了一个安装docker的脚本,辅助做docker安装的实验(ubuntu)
#!/bin/bash #获取用户名 [ pwd == '/root' ] && hn="root@$(hostname):~#" || hn="root ...
- [日志分析]Graylog2采集mysql慢日志
之前聊了一下graylog如何采集nginx日志,为此我介绍了两种采集方法(主动和被动),让大家对graylog日志采集有了一个大致的了解. 从日志收集这个角度,graylog提供了多样性和灵活性,大 ...
- 基于Redis未授权访问的挖矿蠕虫分析
0x01 攻击方式 利用的是通用漏洞入侵服务器并获得相关权限,从而植入挖矿程序再进行隐藏. 通过对脚本的分析,发现黑客主要是利用 Redis未授权访问漏洞进行入侵.脚本里有个python函数. imp ...
- 问不倒的HTTP协议
一.HTTP简介 1.HTTP HTTP:超文本传输协议,是一种通信协议:允许超文本标记文档从Web服务器传送到客户端的浏览器中. 简单:传输html文件的协议. Web:是一种基于超文本和HTML的 ...
- 使用docker构建hadoop集群
docker的使用越来越普遍了,大家不知道docker的还需要进一步学习一下.这次咱们使用docker去进行hadoop集群的构建. 使用docker构建的好处真的很多,一台电脑上可以学习安装很多想做 ...