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¶m2=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请求不能被块传输化