Vert.x Web Client (一)

Vert.x webClient 是一个异步的HTTP和HTTP/2客户端。

Web client使得处理web服务器的http请求与响应变得简单,并提供以下高级特性:

  • Json体的编码与解码
  • 请求/响应 泵
  • 请求参数
  • 统一的错误处理
  • 表单提交

Webclient不是摒弃Vert.x core HttpClient,事实上,webclient依赖于HttpClient,并继承了倔的配置和池化特性,HTTP/2的支持,管道的支持等。想对HTTP request/response进行细粒度的控制可以使用HttpClient。

WebClient不提供WebSocket Api,Vert.x core HttpClient支持WebSocket Api。但不处理cookies。

使用Web Client

为了使用Web client第一步是添加依赖描述

maven pom.xml

<dependency>
 <groupId>io.vertx</groupId>
 <artifactId>vertx-web-client</artifactId>
 <version>4.3.5</version>
</dependency>

gradle  build.gradle

dependencies {
 compile 'io.vertx:vertx-web-client:4.3.5'
}

关于Vert.x核心 HTTPClient的总结

Vert.x Web Client使用vert.x core的核心API ,所以了解HttpClient基本概念是有用的。

创建Web client

下面是用默认选项创建WebClient实例的代码

WebClient client = WebClient.create(vertx);

如果你想指定配置选项,可以参考如下代码

WebClientOptions options = new WebClientOptions()
  .setUserAgent("My-App/1.2.3");
options.setKeepAlive(false);
WebClient client = WebClient.create(vertx, options);

Web Client选项继承Http Client选项,所以你可以设定其中任一种。如果项目中已经存 Http Client,你也可以重用他。

WebClient client = WebClient.wrap(httpClient);

重要提示:

大多数情况下,一个Web client在应用程序启动时创建一次并且重用。否则难以利用连接池等特性带来的好处,如果不正确关闭可能会泄漏资源。

创建请求

  • 没有请求体的简单请求

        通常,你会创建没有请求体的请求。这里一般指http GET,Options 和HEAD请求

WebClient client = WebClient.create(vertx);

// Send a GET request
client
  .get(8080, "myserver.mycompany.com", "/some-uri")
  .send()
  .onSuccess(response -> System.out
    .println("Received response with status code" + response.statusCode()))
  .onFailure(err ->
    System.out.println("Something went wrong " + err.getMessage()));

// Send a HEAD request
client
  .head(8080, "myserver.mycompany.com", "/some-uri")
  .send()
  .onSuccess(response -> System.out
    .println("Received response with status code" + response.statusCode()))
  .onFailure(err ->
    System.out.println("Something went wrong " + err.getMessage()));

你可以向请求URI中添加请求参数

client
  .get(8080, "myserver.mycompany.com", "/some-uri")
  .addQueryParam("param", "param_value")
  .send()
  .onSuccess(response -> System.out
    .println("Received response with status code" + response.statusCode()))
  .onFailure(err ->
    System.out.println("Something went wrong " + err.getMessage()));

任意请求参数将在预填充请求

HttpRequest<Buffer> request = client
  .get(
    8080,
    "myserver.mycompany.com",
    "/some-uri?param1=param1_value&param2=param2_value");

// Add param3
request.addQueryParam("param3", "param3_value");

// Overwrite param2
request.setQueryParam("param2", "another_param2_value");

设置请求URI,丢弃请求查询参数

  • 带请求体的请求       

当你需要使带请求体的请求时,请使用相同的API,调用sendXXX需要请求体参数的方法。

使用sendBuff发送一个缓存体

client
  .post(8080, "myserver.mycompany.com", "/some-uri")
  .sendBuffer(buffer)
  .onSuccess(res -> {
    // OK
  });

发送单一缓存是有用的,但是通常你不会加载完整内容到内存,因为内容可能太大。或者你想并发处理请求,并且想最小化每个请求。为了这个目的 WebClient可以用sendStream方法发送ReadStream<Buffer>(如 AsyncFile 是一个缓冲请求流ReadStream<Buffer> )

client
  .post(8080, "myserver.mycompany.com", "/some-uri")
  .sendStream(stream)
  .onSuccess(res -> {
    // OK
  });

WebClient为你维护建立传输,当不知通请求流的长度时将使块(chunk)传输编码.

如果你知道流大小,你可能通过content-length头进行设定

fs.open("content.txt", new OpenOptions(), fileRes -> {
  if (fileRes.succeeded()) {
    ReadStream<Buffer> fileStream = fileRes.result();

    String fileLen = "1024";

    // Send the file to the server using POST
    client
      .post(8080, "myserver.mycompany.com", "/some-uri")
      .putHeader("content-length", fileLen)
      .sendStream(fileStream)
      .onSuccess(res -> {
        // OK
      })
    ;
  }
});

post请求不能被块传输化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值