当我尝试使用VERTX HTTP CLIENT获取数据时,它给我null

时间:2016-10-20 08:20:34

标签: java vert.x vertx-httpclient

嗨,任何人都可以看看:

当我尝试使用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());

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

2 个答案:

答案 0 :(得分:0)

这是正确的,您将获得NPE,因此在您的代码中,您使用clientResponse初始化{ null }变量。如果您现在按照代码的执行方式进行操作,您将看到原因:

  1. 创建一个请求对象:client.request(
  2. 配置收到回复后将执行的内容:`response - > {...}
  3. 您向请求添加标头:putHeader(...)
  4. 您触发请求end(clientResponse[0].toString())
  5. 现在您看到clientResponse[0]仍为空(这是您初始化它的值。所以发生的是您正在调用:

    null.toString()
    

    哪个无效,将始终抛出Null Pointer Exception

答案 1 :(得分:0)

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

  1. 您必须使用HttpClientResponse的bodyHandler处理响应,然后您无法提供外部变量,除非最终
  2. 使用asyncResponse总是更好,以免阻塞调用线程,特别是如果你依赖外部系统(在你的情况下是另一个Web服务)
  3. 我不确定您是否要提供正文,请求中的.end()包含新的"客户请求正文"但是当你进行GET时,正文必须为空
  4. 尝试使用标准HttpHeadersMediaType(我个人使用JAX-RS中的MediaType)而不是编写自己的字符串。
  5. 尝试使用正确的记录器System.out.println(...)
  6. 以下代码显示了我如何设置将响应返回给原始调用者:

    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();
    

    有很多方法可以做同样的事情,你可以查看official manual page