1

嗨,任何人都可以看看:

当我尝试使用 VERTX HTTP CLIENT 获取数据时,它在最后一行给了我空指针异常,并且当我使用 java HTTP CLIENT 时,相同的 URL 提供了数据:

HttpClientOptions options = new HttpClientOptions().setKeepAlive(false);

options.setLogActivity(true);    
options.setDefaultHost("http://delvmpllbbab10");
options.setDefaultPort(7003);

HttpClient client = vertx.createHttpClient(options);
HttpClientResponse[] clientResponse = {null};

client.request(HttpMethod.GET, "/rcsservices/homePage", response -> {
    System.out.println("Received response with status code " + response.statusCode());

    clientResponse[0] = response;

}).putHeader("content-type", "application/json").end(clientResponse[0].toString());

这段代码我有问题吗...

4

2 回答 2

0

这是正确的,你会得到一个NPE,所以在你的代码中你用 初始化clientResponse变量{ null }。如果您现在遵循代码的执行方式,您将看到原因:

  1. 创建请求对象:client.request(
  2. 您配置收到响应后将执行的内容:`response -> { ... }
  3. 您向请求添加标头:putHeader(...)
  4. 你触发请求end(clientResponse[0].toString())

现在您看到它clientResponse[0]仍然是 null (那是您初始化它的值。所以发生的事情是您正在调用:

null.toString()

这是无效的,并且总是会抛出一个Null Pointer Exception.

于 2016-10-20T14:00:58.713 回答
0

我开始使用 Vert-X 框架时遇到了同样的问题,我可以从您的代码中注意到以下改进:

  1. 您必须使用 HttpClientResponse 的 bodyHandler 处理响应,然后您不能提供外部变量,除非 final
  2. 最好使用 asyncResponse 以免阻塞调用线程,特别是如果您依赖外部系统(在您的情况下是另一个 Web 服务)
  3. 我不确定您是否要提供正文,.end()请求中包含新的“客户端请求正文”,但是当您进行 GET 时,正文必须为空
  4. 尝试使用标准HttpHeadersMediaType(我个人MediaType从 JAX-RS 使用)而不是编写自己的字符串。
  5. 尝试改用合适的 LoggerSystem.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();

有很多方法可以做同样的事情,你可以查看官方手册页

于 2016-10-21T13:56:42.710 回答