vertX Web 客户端

620 阅读2分钟

这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战

VertX web Client 依赖

MAVEN

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

Gradle

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

创建 Web 客户端

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 客户端选项继承了 Http 客户端选项,应用程序中已有 HTTP 客户端,那么依旧可以用


WebClient client = WebClient.create(vertx);

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请求

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

支持直接发送Buffer,但是如果不想将内容直接加载到内存的话,或者想要处理许多并发请求,并且希望每个请求都为最小值。为此,Web 客户端可以使用stream发送("ReadStream")

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

Json

发送 json时,使用 sendJsonObject

client
  .post(8080, "myserver.mycompany.com", "/some-uri")
  .sendJsonObject(
    new JsonObject()
      .put("firstName", "Dale")
      .put("lastName", "Cooper"))
  .onSuccess(res -> {
    // OK
  });

Web 客户端负责为您设置传输泵(transfer pump)。由于流的长度不知道请求将使用大块的 transfer encoding .

当知道流的大小时,应在使用头之前指定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
      })
    ;
  }
});

表格

MultiMap form = MultiMap.caseInsensitiveMultiMap();
form.set("firstName", "Dale");
form.set("lastName", "Cooper");

// Submit the form as a form URL encoded body
client
  .post(8080, "myserver.mycompany.com", "/some-uri")
  .sendForm(form)
  .onSuccess(res -> {
    // OK
  });

重复使用请求

该方法可以安全地调用多次,因此很容易配置和重用对象send``HttpRequest

HttpRequest<Buffer> get = client
  .get(8080, "myserver.mycompany.com", "/some-uri");
​
get
  .send()
  .onSuccess(res -> {
    // OK
  });
​
// Same request again
get
  .send()
  .onSuccess(res -> {
    // OK
  });

当心,虽然实例是可变的。因此,在修改缓存实例之前,您应该调用该方法。HttpRequest``copy

HttpRequest<Buffer> get = client
  .get(8080, "myserver.mycompany.com", "/some-uri");

get
  .send()
  .onSuccess(res -> {
    // OK
  });

// The "get" request instance remains unmodified
get
  .copy()
  .putHeader("a-header", "with-some-value")
  .send()
  .onSuccess(res -> {
    // OK
  });

超时

您可以使用特定 http 请求设置超时。timeout

client
  .get(8080, "myserver.mycompany.com", "/some-uri")
  .timeout(5000)
  .send()
  .onSuccess(res -> {
    // OK
  })
  .onFailure(err -> {
    // Might be a timeout when cause is java.util.concurrent.TimeoutException
  });

如果请求未在超时期间返回任何数据,则例外将传递给响应处理程序。

处理 http 响应

当 Web 客户发送请求时,总是处理单个同项结果。HttpResponse

在成功结果中,回调在收到响应后进行

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

默认情况下,Vert.x Web 客户端请求只有在网络级别发生错误时才会以错误结束。换句话说,响应或错误内容类型的响应被视为失败。如果您希望 Web 客户端自动执行理智检查,使用response predicates404 Not Found