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>
SchemaParser
代码聚焦
SchemaParser schemaParser = SchemaParser.createDraft7SchemaParser(
SchemaRouter.create(vertx, new SchemaRouterOptions())
);
提示:目前Vert.x 4.5.9最新稳定4版本,SchemaParser 已经提示弃用,但是没有替换的方案,所以继续使用,可能5.x有方案吧。
代码聚焦
//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工具测试
从上图报错来看与我们预期结果一致。
从上图报错来看,与我们预期结果一致。
从上图来看,结果与预期一致。
在入参address不满足正则条件时候报错,与预期结果一致
输入满足正则的再试
正常返回,与预期结果一致。
body 参数包含:
代码聚焦
//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));
});
以上接口校验了
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]
http://blog.xqlee.com/article/2408131641216251.html