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