vert.x-语法基础

2020-08-10  本文已影响0人  黄海佳

一、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标头告诉客户端实际返回的内容的内容类型,四种常见取值如下
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());
      }
    });
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获取请求的三种方式分别如下:

3.url请求参数的获取
    //经典模式
    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模式
    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();
}
上一篇 下一篇

猜你喜欢

热点阅读