Vert.x query/path/form/json参数校验

编程教程 > Java > Vert.x (298) 2024-11-26 14:39:04

前言

Web项目开发一般接口入参都有校验需求,Vert.x 4 目前已有插件实现参数校验,引用之前的项目《Vert.x 4 Web应用初识》源码

 

引入验证插件

maven pom.xml 添加依赖

<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-web-validation</artifactId>
<version>4.5.9</version>
</dependency>

 

Vert.x 参数校验示例

 

创建一个SchemaParser

代码聚焦

SchemaParser schemaParser = SchemaParser.createDraft7SchemaParser(
SchemaRouter.create(vertx, new SchemaRouterOptions())
);

提示:目前Vert.x 4.5.9最新稳定4版本,SchemaParser 已经提示弃用,但是没有替换的方案,所以继续使用,可能5.x有方案吧。

 

接口校验查询Query参数和路径Path参数

代码聚焦

//request / path param 参数校验
router.get("/user/:id")
.handler(
ValidationHandlerBuilder
.create(schemaParser)
.pathParameter(Parameters.param("id", Schemas.intSchema()))//必填int路径参数校验
.queryParameter(Parameters.param("name",Schemas.stringSchema()))//必填字符串校验
.queryParameter(Parameters.optionalParam("address",
Schemas.stringSchema()
.with(Keywords.pattern(Pattern.compile("^.{2,10}$"))))) //正则校验
.build()
).handler(routingContext -> {
RequestParameters parameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY);
Integer id = parameters.pathParameter("id").getInteger();
String name = parameters.queryParameter("name").getString();
log.info("id : {} , name : {}", id, name);

routingContext.json(new JsonObject().put("id", id).put("name", name));
});

 

使用postman工具测试

 

测试1:传入错误类型路径参数
Vert.x query/path/form/json参数校验_图示-93133fb4f62543d8bac9fbfcba166c03.png

从上图报错来看与我们预期结果一致。

 

测试2:传入正确路径参数 其他不传
Vert.x query/path/form/json参数校验_图示-b8919ad17d2c4af9a06ce7dd1ac15579.png

从上图报错来看,与我们预期结果一致。

 

测试3:传入正确路径参数id,必填 name参数
Vert.x query/path/form/json参数校验_图示-6b1e161f1c324d5da0629e01a6124fb1.png

从上图来看,结果与预期一致。

 

测试4:传入正确路径参数id,必填 name参数,传入长度1位address参数
Vert.x query/path/form/json参数校验_图示-d9745bc2f5004dd899f6bda63135dd39.png

在入参address不满足正则条件时候报错,与预期结果一致

输入满足正则的再试

Vert.x query/path/form/json参数校验_图示-7749e1010a524d6a9f1be75a62548080.png

正常返回,与预期结果一致。

 

接口body 参数校验

body 参数包含:

  • multipart-form参数
  • form-url-encoded参数
  • json 参数

 

代码聚焦

//body 参数校验
//定义校验内容
ObjectSchemaBuilder bodySchemaBuilder = Schemas.objectSchema()
.requiredProperty("name", Schemas.stringSchema().with(Keywords.minLength(2)))
.requiredProperty("age", Schemas.intSchema());

router.post("/form/post")
.handler(BodyHandler.create())//必须先解析Body参数再验证
.handler(
ValidationHandlerBuilder.create(schemaParser)
.predicate(RequestPredicate.BODY_REQUIRED)//body必填
.body(Bodies.multipartFormData(bodySchemaBuilder))//multipart Form
.body(Bodies.formUrlEncoded(bodySchemaBuilder)) // form url encode
.body(Bodies.json(bodySchemaBuilder)) // json
.build()
).handler(routingContext -> {
RequestParameters parameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY);
JsonObject jsonObject = parameters.body().getJsonObject();
String name = jsonObject.getString("name");
Integer age = jsonObject.getInteger("age");
log.info("name : {} , age : {}", name, age);
routingContext.json(new JsonObject().put("name", name).put("age", age));
});

以上接口校验了

  • 请求必须包含body
  • body必须包含name字段,字符串类型
  • name字段最少2位长度
  • 必须包含age,数字类型

postman 工具测试

Vert.x query/path/form/json参数校验_图示-55bf4ddc8fa64c538e7cbd88fc05b631.png
不传任何参数

上图测试不传递任何参数,控制台报错Body 必须,与预期结果一致。

Vert.x query/path/form/json参数校验_图示-412715cb5e7e446590a9557b59bb16fb.png
传递name长度1位

上图测试,传递name长度1位,控制台报错,需要2位,与预期结果一致。

Vert.x query/path/form/json参数校验_图示-e63fb5e90cea4c4bae8d7e4246b3acf1.png
age不传情况

age不传递提示必须包含age,与预期结果一致。

Vert.x query/path/form/json参数校验_图示-67ca5399f05147dd8dbdfaa97cae8c36.png
所有都正确

所有都正确,返回与预期结果一致

 

完整代码

[user]

MainVerticle

@Slf4j
public class MainVerticle extends AbstractVerticle {

@Override
public void start(Promise<Void> startPromise) throws Exception {


Router router = Router.router(vertx);

SchemaParser schemaParser = SchemaParser.createDraft201909SchemaParser(
SchemaRouter.create(vertx, new SchemaRouterOptions())
);


//request / path param 参数校验
router.get("/user/:id")
.handler(
ValidationHandlerBuilder
.create(schemaParser)
.pathParameter(Parameters.param("id", Schemas.intSchema()))//必填int路径参数校验
.queryParameter(Parameters.param("name",Schemas.stringSchema()))//必填字符串校验
.queryParameter(Parameters.optionalParam("address",
Schemas.stringSchema()
.with(Keywords.pattern(Pattern.compile("^.{2,10}$"))))) //正则校验
.build()
).handler(routingContext -> {
RequestParameters parameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY);
Integer id = parameters.pathParameter("id").getInteger();
String name = parameters.queryParameter("name").getString();
log.info("id : {} , name : {}", id, name);

routingContext.json(new JsonObject().put("id", id).put("name", name));
});


//body 参数校验
//定义校验内容
ObjectSchemaBuilder bodySchemaBuilder = Schemas.objectSchema()
.requiredProperty("name", Schemas.stringSchema().with(Keywords.minLength(2)))
.requiredProperty("age", Schemas.intSchema());

router.post("/form/post")
.handler(BodyHandler.create())//必须先解析Body参数再验证
.handler(
ValidationHandlerBuilder.create(schemaParser)
.predicate(RequestPredicate.BODY_REQUIRED)//body必填
.body(Bodies.multipartFormData(bodySchemaBuilder))//multipart Form
.body(Bodies.formUrlEncoded(bodySchemaBuilder)) // form url encode
.body(Bodies.json(bodySchemaBuilder)) // json
.build()
).handler(routingContext -> {
RequestParameters parameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY);
JsonObject jsonObject = parameters.body().getJsonObject();
String name = jsonObject.getString("name");
Integer age = jsonObject.getInteger("age");
log.info("name : {} , age : {}", name, age);
routingContext.json(new JsonObject().put("name", name).put("age", age));
});


vertx.createHttpServer()
.requestHandler(router)
.listen(config().getInteger("http.port", 8080), result -> {
if (result.succeeded()) {
startPromise.complete();
}else {
startPromise.fail(result.cause());
}
});
}
}

[/user]

 


评论
User Image
提示:请评论与当前内容相关的回复,广告、推广或无关内容将被删除。

相关文章
前言Web项目开发一般接口入参都有校验需求,Vert.x 4 目前已有插件实现参数校验,引用之前的项目《Vert.x 4 Web应用初识》源码 引入验证插件ma
前言Vert.x 中实现全局数据共享,如环境参数等。Vertx数据共享实现共享数据存入/更新SharedData sharedData = vertx.shar
前言项目由之前的第一个vert.x 4 项目改编而来,vert.x项目创建参考: vert.x 4 web应用编写修改MainVerticle文件,内容如下:p
Vert.x java 入门,Vert.x这个框架在常规的web业务开发中估计还不是很成熟。但是了解了他的一些原理我觉得可以有一番作为。今天主要简单讲解下eclipse Vert.x是什么有什么...
前言最新的Ver.x 4 从idea工具运行启动,并访问。项目创建通过vert.x官网生成器完成。Vert.x 4项目创建打开vert.x官网项目生成地址,ht
前言这里主要讲解Vert.x配置文件的读取和使用,引用之前的项目《Vert.x 4 Web应用初识》 引入必要依赖maven pom.xml&lt;dependenc
前言项目创建参考之前的《Vert.x 4 Web应用初识》。本文通过Vert.x实现了REST接口的CRUD操作。通过本教程你可以获得以下内容vert.x项目中
前言文件上传在web应用比较常见,本文以vert.x web实现文件上传功能。引用之前的项目《Vert.x 4 Web应用初识》作为基础,添加了日志。 Vert
前言Vert.x Router路由中多个处理器之间通过RoutingContext共享数据实现。 Vert.x Router 上下文数据数据设置routingC
前言本文主要讲解在Vert.x环境下与Mysql数据库连接和操作,实现基础的增删改查和事务,以及REST接口返回数据库中查询结果。项目引用之前的《Vert.x
前言vert.x 默认是没有像spring的依赖注入的,需要自己结合vertx-service-proxy插件实现。本文引用项目为基础《Vert.x 4 Web
前言创建一个常规的web项目肯定需要一个模板引擎来实现,引用之前的项目《Vert.x 4 Web应用初识》基础结构目前vert.x支持多款模板引擎,包括:MVE
前言引用《Vert.x 4 Web REST CRUD接口应用》项目,加入日志依赖并编码实现类似Interceptor功能处理。vert.x日志集成参考《Ver
前言接上一篇《Vert.x 4 Web应用初识》,在web应用中除了访问地址得到动态的信息还有静态的资源库访问,如 jQuery / bootstrap 等前端
前言前面已经讲述了在vertx中,如何实现服务的注册和使用,这里主要讲解接口的暴露层,在vertx中如何实现类似Spring MVC的Controller层。项