Vert.x Web Client (三)复用请求

本文详细介绍了如何使用WebClient进行HTTP请求,包括重用HttpRequest、设置超时、处理HTTP响应及解码不同类型的响应体。示例代码展示了发送GET请求、处理成功与失败回调、解码JSON对象及POJO等操作。此外,还提到了BodyCodec工具用于自定义响应体解码。
摘要由CSDN通过智能技术生成

发送方法可以安全调用多次,达到这个目的可以如下配置实现重用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
  });
  • 超时

你可以用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 Client发送一个请,你会处理一个异步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()));

注意:

默认,Web Client因错误结束,只在网络层出现错误时才发生。换句话说 一个404未找到的响应,或者一个错误内容类型的错误,是不会被认为是失败的。如果你想Web Client执行自动健康检查可以使用请求预判。

警告:

响应是完整缓冲的,用BodyCodec.pipe抽取响应到写出流。

  • 解码响应

默认,Web Client提供http 响应体作为一个Buffer,并且不应用任何解码。

定制响应体解码器通过BodyCodec实现

  • 纯文本
  • Json对象
  • Json映射成POJO
  • 写出流WriteStream

响应体编码将难以理解的二进数据流解码成特定对象实全,在你的响应处理器中保存解码步骤

用BodyCodec.jsonObject方法实现json解码

 

client
  .get(8080, "myserver.mycompany.com", "/some-uri")
  .as(BodyCodec.jsonObject())
  .send()
  .onSuccess(res -> {
    JsonObject body = res.body();

    System.out.println(
      "Received response with status code" +
        res.statusCode() +
        " with body " +
        body);
  })
  .onFailure(err ->
    System.out.println("Something went wrong " + err.getMessage()));

在Java,Groovy 或者Kotlin定的同时的Json可以被解码成POJO

client
  .get(8080, "myserver.mycompany.com", "/some-uri")
  .as(BodyCodec.json(User.class))
  .send()
  .onSuccess(res -> {
    User user = res.body();

    System.out.println(
      "Received response with status code" +
        res.statusCode() +
        " with body " +
        user.getFirstName() +
        " " +
        user.getLastName());
  })
  .onFailure(err ->
    System.out.println("Something went wrong " + err.getMessage()));

当要大的响应体时,用BodyCodec.pipe方法。这个响应体编码抽取响应体缓存到一个WriteStream并且通知成功或失败操作的响应。

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

查看Api返回一个json对象变得顺畅。例如TwitterApi可以提供tweets feed。 为了处理这些情况,你可以使用BodyCodec.jsonStream方法。传递一个Json解析器并从HTTP响应中读取JSON流。

JsonParser parser = JsonParser.newParser().objectValueMode();
parser.handler(event -> {
  JsonObject object = event.objectValue();
  System.out.println("Got " + object.encode());
});
client
  .get(8080, "myserver.mycompany.com", "/some-uri")
  .as(BodyCodec.jsonStream(parser))
  .send()
  .onSuccess(res ->
    System.out.println("Received response with status code" + res.statusCode()))
  .onFailure(err ->
    System.out.println("Something went wrong " + err.getMessage()));

最终,如果你不感兴趣响应内容,BodyCodec.none方法丢弃整个响应体

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

当你不知道响应的内容类型时,你可使用bodyAsXXX()方法,将响应解码成特定类型

client
  .get(8080, "myserver.mycompany.com", "/some-uri")
  .send()
  .onSuccess(res -> {
    // Decode the body as a json object
    JsonObject body = res.bodyAsJsonObject();

    System.out.println(
      "Received response with status code" +
        res.statusCode() +
        " with body " +
        body);
  })
  .onFailure(err ->
    System.out.println("Something went wrong " + err.getMessage()));

警告:

这仅将响应解码成一个Buffer时有效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值