“这是我参与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 predicates。404 Not Found