前言
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:传入错误类型路径参数
从上图报错来看与我们预期结果一致。
测试2:传入正确路径参数 其他不传
从上图报错来看,与我们预期结果一致。
测试3:传入正确路径参数id,必填 name参数
从上图来看,结果与预期一致。
测试4:传入正确路径参数id,必填 name参数,传入长度1位address参数
在入参address不满足正则条件时候报错,与预期结果一致
输入满足正则的再试
正常返回,与预期结果一致。
接口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 工具测试
上图测试不传递任何参数,控制台报错Body 必须,与预期结果一致。
上图测试,传递name长度1位,控制台报错,需要2位,与预期结果一致。
age不传递提示必须包含age,与预期结果一致。
所有都正确,返回与预期结果一致
完整代码
[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]
版权所有 © 【代码谷】 欢迎非商用转载,转载请按下面格式注明出处,商业转载请联系授权,违者必究。(提示:点击下方内容复制出处)
源文:《Vert.x query/path/form/json参数校验》,链接:https://www.daimagu.com/article/2408131641216251.html,来源:【代码谷】
评论