美文网首页
vert.x-语法基础

vert.x-语法基础

作者: 黄海佳 | 来源:发表于2020-08-10 22:24 被阅读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标头告诉客户端实际返回的内容的内容类型,四种常见取值如下
  • 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();
}

相关文章

  • vert.x-语法基础

    一、vertx中starter代码 1.putHeader中Content-Type参数 在响应中,Content...

  • 【Android】知识点汇总,坚持原创ing

    Android基础 Java基础 Java基础——Java内存模型和垃圾回收机制 语法基础 语法基础——C语法基础...

  • java

    语法基础1.1 java初体验(语法基础)1.2 变量和常量(语法基础)1.2 变量和常量(语法基础)1.4 流程...

  • 软帝学院:80道java基础部分面试题(四)

    Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集...

  • 快速上⼿ Kotlin

    快速上⼿ Kotlin 基础语法 函数基础语法 与 Java 代码互调 Java 与 Kotlin 交互的语法变化...

  • Java面试题知识点

    1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...

  • Java初级面试题

    1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...

  • 高考英语基础语法单句语法填空

    高考英语基础语法单句语法填空

  • Go语言基础语法--注释、基础结构2

    章节 GO语言基础语法--注释、基础结构(重要) 1.GO语言基础语法---注释、基础结构 基础结构注意事项 源文...

  • Swift5.1——前言

    主要是针对Swift5.1,基础语法,和内部剖析。 基础语法 基础语法 流程控制 函数 枚举 可选项 为什么选择S...

网友评论

      本文标题:vert.x-语法基础

      本文链接:https://www.haomeiwen.com/subject/gdrsdktx.html