我开始使用 Vert-X 框架时遇到了同样的问题,我可以从您的代码中注意到以下改进:
- 您必须使用 HttpClientResponse 的 bodyHandler 处理响应,然后您不能提供外部变量,除非 final
- 最好使用 asyncResponse 以免阻塞调用线程,特别是如果您依赖外部系统(在您的情况下是另一个 Web 服务)
- 我不确定您是否要提供正文,
.end()
请求中包含新的“客户端请求正文”,但是当您进行 GET 时,正文必须为空
- 尝试使用标准
HttpHeaders
和MediaType
(我个人MediaType
从 JAX-RS 使用)而不是编写自己的字符串。
- 尝试改用合适的 Logger
System.out.println(...)
以下代码显示了我如何设法将响应返回给原始调用者:
public void callWebService(@Context HttpServerRequest request, @Suspended final AsyncResponse asyncResponse) {
HttpClientOptions options = new HttpClientOptions().setKeepAlive(false);
options.setLogActivity(true);
options.setDefaultHost("http://delvmpllbbab10");
options.setDefaultPort(7003);
HttpClient client = vertx.createHttpClient(options);
client.request(HttpMethod.GET, "/rcsservices/homePage", response -> {
System.out.println("Received response with status code " + response.statusCode());
int code = response.statusCode();
if (code == 200) {
response.bodyHandler(bufferResponse -> {
// Adapt according your response type, could be String as well
JsonObject httpResult = bufferResponse.toJsonObject();
System.out.println("Received HTTP response with body " + httpResult);
asyncResponse.resume(Response.ok(httpResult).build());
});
} else {
response.bodyHandler(bufferResponse -> {
// Return null in a JSON Object in case of error
String httpResult = "{null}";
asyncResponse.resume(Response.status(code).entity(httpResult).build());
});
}
}).putHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON).end();
有很多方法可以做同样的事情,你可以查看官方手册页。