2016-10-20 8 views
1

Привет Может кто-нибудь пожалуйста, посмотрите:Когда я пытаюсь получить данные с помощью VertX HTTP CLIENT его дает мне пустой

Когда я пытаюсь получить данные с помощью VertX HTTP CLIENT его дает мне исключения нулевого указателя в прошлом линии и тот же URL предоставляют данные, когда я использовал ява HTTP КЛИЕНТ:

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

является ли этот код у меня есть некоторые проблемы ...

ответ

0

это правильно, вы получите NPE, поэтому в коде следует инициализировать clientResponse переменная с { null }. Если теперь проследить, как выполняется код, который вы увидите, почему:

  1. создать запрос объекта: client.request(
  2. настроить то, что будет выполняться после того, как будет получен ответ: `ответ -> {...}
  3. добавить заголовок к запросу: putHeader(...)
  4. вы вызываете запрос end(clientResponse[0].toString())

Теперь вы видите, что clientResponse[0] по-прежнему нулевой (это было значение, которое вы его инициализировали. Так что же происходит, что вы звоните:

null.toString() 

Который является недействительным, и всегда будет бросить Null Pointer Exception.

0

Я была такая же проблема, как я начал использовать Вера-X рамку, и я могу заметить следующие улучшения из вашего кода:

  1. Вы должны обработать ответ с bodyHandler на HttpClientResponse, то вам не может подавать внешнюю переменную, если только окончательный
  2. Всегда лучше использовать asyncResponse, чтобы не блокировать вызывающий поток, особенно если вы полагаетесь на внешнюю систему (другой веб-сервис в вашем случае)
  3. Я не уверен вы хотите дать тело или нет, .end() по запросу содержит новый «орган запроса клиента», но когда вы делаете GET, тело должно быть пустым
  4. Попробуйте использовать стандартные HttpHeaders и MediaType (я лично использую MediaType от JAX-RS), вместо этого записывая собственные строки.
  5. Попробуйте использовать правильный 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(); 

Есть много способов сделать то же самое , и вы можете проверить official manual page.