2013-08-14 16 views
9

Używam klienta HTTP Apache do przetestowania mojego WS. Napisałem WS w koszulce. URL dla tego WS jestapache http klient org.apache.http.NoHttpResponseException: serwer docelowy nie odpowiedział

http://localhost:8080/mobilestore/rest/sysgestockmobilews/getinventory?xml=dataString 

nazwać tę WS używając url mam napisać metodę, która jest następująca

public static void getInventory(String input) 
     throws ClientProtocolException, IOException { 

    System.out.println(input); 
    String url = URL + "getinventory"; 
    HttpClient client = new DefaultHttpClient(); 

    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
    nameValuePairs.add(new BasicNameValuePair("xml", input)); 
    String paramString = URLEncodedUtils.format(nameValuePairs, "utf-8"); 
    url += "?" + paramString; 
    System.out.println(url); 
    HttpGet request = new HttpGet(url); 
    HttpResponse response = client.execute(request); 
    BufferedReader rd = new BufferedReader(new InputStreamReader(response 
      .getEntity().getContent())); 

    String line = ""; 
    while ((line = rd.readLine()) != null) { 
     System.out.println(line); 
    } 

} 

Teraz gdy uruchamiam program i przekazać URL do tej funkcji otrzymuję wyjątek na linii

HttpResponse response = client.execute(request); 

Wyjątek jest jak postępować

Aug 14, 2013 9:31:50 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute 
INFO: I/O exception (org.apache.http.NoHttpResponseException) caught when processing   request: The target server failed to respond 
Aug 14, 2013 9:31:50 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute 
INFO: Retrying request 
Aug 14, 2013 9:31:50 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute 
INFO: I/O exception (org.apache.http.NoHttpResponseException) caught when processing request: The target server failed to respond 
Aug 14, 2013 9:31:50 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute 
INFO: Retrying request 
Aug 14, 2013 9:31:50 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute 
INFO: I/O exception (org.apache.http.NoHttpResponseException) caught when processing  request: The target server failed to respond 
Aug 14, 2013 9:31:50 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute 
INFO: Retrying request 
Exception in thread "main" org.apache.http.NoHttpResponseException: The target server failed to respond 
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:95) 
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:62) 
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254) 
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289) 
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252) 
at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:191) 
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300) 
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127) 
at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:715) 
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:520) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784) 
at com.tainosystems.http.client.TestWs.getInventory(TestWs.java:66) 
at com.tainosystems.http.client.TestWs.main(TestWs.java:47) 

Teraz, jeśli użyję adresu URL WS ​​i uderzę nim za pomocą dowolnej przeglądarki, otrzymam oczekiwany wynik, ale chcę wiedzieć, co jest nie tak z moim kodem klienckim http apache.

+0

Podobno ten sam problem został opublikowany tutaj: http://stackoverflow.com/questions/10558791/apache-httpclient-interim-error-nohttpresponseexception – pls

Odpowiedz

2

przeszedłem linków z tutaj, ale do tej odpowiedzi: get NoHttpResponseException for load testing

które wyróżniają mnie na właściwe tory. Aby zaktualizować odpowiedź nieco Oto rozwiązanie przy użyciu bieżącego http-client 4.5 API:

private final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(createHttpClient()); 

private CloseableHttpClient createHttpClient() { 
    return HttpClients.custom().setRetryHandler((exception, executionCount, context) -> { 
      if (executionCount > 3) { 
       LOGGER.warn("Maximum tries reached for client http pool "); 
       return false; 
      } 
      if (exception instanceof org.apache.http.NoHttpResponseException) { 
       LOGGER.warn("No response from server on " + executionCount + " call"); 
       return true; 
      } 
      return false; 
     }).build(); 
} 

ja również korzystania wiosna-web tam więc użyłem klienta jako parametr dla fabryki RestTemplate ponieważ chcę go mieć używane w RestTemplate.

-4

Sprawdź, czy twój "URL" ma poprawną wartość . Komunikat o błędzie "Brak odpowiedzi serwera docelowego". To oznacza, że ​​podany adres URL jest nieprawidłowy lub serwer został zamknięty. Jeśli podałeś niewłaściwą nazwę/wartość parametru lub coś takiego, komunikat o błędzie będzie inny.

+1

adres URL jest poprawny. Używam tego adresu URL w przeglądarce i działa dobrze tam –

+0

Nie wiem, co zrobiłeś inaczej między żądaniem przeglądarki i żądaniem aplikacji Java, ale jest jasne, że twój klient i tak nie odczytuje nagłówka HTTP z serwera. Sprawdź kod źródłowy, z którego pochodzą błędy w kliencie http Apache. – wonhee

+0

do { // wyczyść bufor this.lineBuf.clear(); int i = sessionBuffer.readLine (this.lineBuf); if (i == -1 && count == 0) { // Serwer właśnie zrzucił połączenie wyrzuć nowy wyjątek NoHttpResponseException ("Serwer docelowy nie odpowiedział"); } – wonhee

Powiązane problemy