一、vertx中starter代码
@Override
public void start(Promise<Void> startPromise) throws Exception {
vertx.createHttpServer().requestHandler(req -> {
req.response()
.putHeader("content-type", "text/plain")
.end("Hello from Vert.x!");
}).listen(8888, http -> {
if (http.succeeded()) {
startPromise.complete();
System.out.println("HTTP server started on port 8888");
} else {
startPromise.fail(http.cause());
}
});
}
1.putHeader中Content-Type参数 在响应中,Content-Type标头告诉客户端实际返回的内容的内容类型,四种常见取值如下
- text/plain , text/xml 文本参数,XML-RPC(XML Remote Procedure Call)。它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。
- application/json :序列化后的 JSON 字符串,改造如下:
vertx.createHttpServer().requestHandler(req -> {
req.response()
.putHeader("content-type", "application/json")
.end(new JsonObject().put("name","haijia").toString());
}).listen(8888, http -> {
if (http.succeeded()) {
startPromise.complete();
System.out.println("HTTP server started on port 8888");
} else {
startPromise.fail(http.cause());
}
});
- multipart/form-data :表单上传文件时,必须让 form 的 enctyped 等于这个值
- application/x-www-form-urlencoded :最常见 POST 提交数据的方式。浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。
2.路由Router
public class MainVerticle extends AbstractVerticle {
Router router;
@Override
public void start(Promise<Void> startPromise) throws Exception {
//其中vertx在初始化后才会生成
router = Router.router(vertx);
//配置roter解析Url
router.route("/").handler(req -> {
req.response()
.putHeader("content-type", "application/json")
.end(new JsonObject().put("name","haijia").toString());
});
vertx.createHttpServer().requestHandler(router).listen(8888, http -> {
if (http.succeeded()) {
startPromise.complete();
System.out.println("HTTP server started on port 8888");
} else {
startPromise.fail(http.cause());
}
});
}
}
其中设置router获取请求的三种方式分别如下:
- router.route("/")
- router.get("/")
- router.post("/")
3.url请求参数的获取
- 经典模式:ip/test?page=1&age=10
//经典模式
router.post("/test").handler(req -> {
String page = req.request().getParam("page");
req.response()
.putHeader("content-type", "application/json")
.end(new JsonObject().put("page",page ).toString());
});
- rest模式:ip/test/1/10
//REST模式
router.post("/test/:page/:age").handler(req -> {
String page = req.request().getParam("page");
req.response()
.putHeader("content-type", "application/json")
.end(new JsonObject().put("page",page).toString());
});
4.body参数的获取
router.route().handler(BodyHandler.create());
//如果获取form-data格式
router.route("/test").handler(req -> {
String page = req.request().getFormAttribute("page");
req.response()
.putHeader("content-type", "application/json")
.end(new JsonObject().put("name","haijia").toString());
});
//获取json
@io.vertx.codegen.annotations.Nullable JsonObject bodyAsJson = req.getBodyAsJson();
二、Future+Promise优雅的异步编程
在vert.x中提供了一个链式调用的子接口——Future,它有个compose()方法可以链式调用,虽然Future实现了链式调用,但是无法封装异步回调结果,需要借助Handler的另一个子接口Promise来封装异步调用的结果,并生成Future。需要注意的是只有Handler<AsyncResult>的情况下才可以使用Future+Promise
MySQLPool client;
private Future<SqlConnection> getCon(){
Promise<SqlConnection> promise = Promise.promise();
client.getConnection(ar1 ->{
if(ar1.succeeded()){
SqlConnection conResult = ar1.result();
promise.complete(conResult);
}else{
promise.fail(ar1.cause());
}
});
return promise.future();
}
this.getCon()
.compose(con->this.getRous(con,offset))//链式调用
.onSuccess(row->{
//处理加工出来的数据
})
.onFailure(throwable -> {
//异常处理
throwable.toString();
});
二、异常处理
在Vert.x中,Vert.x为我们封装优雅的异常处理方式,即不需要我们手写try..catch。Vert.x中,大多数Handler接口都是Handler < AsyncResult<T>>的形式,其中AsyncResult,里面既封装了正确的返回结果,也封装了Vert.x帮我们捕捉到的异常
源码如下:
public interface AsyncResult<T> {
T result();
Throwable cause();
boolean succeeded();
boolean failed();
}
网友评论