apache http client org.apache.http.NoHttpResponseException: The target server failed to respond
I went through the links from here and got to this answer: get NoHttpResponseException for load testing
That set me on the right track. To update the answer a bit here is the solution using the current 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();
}
I also use spring-web there so I used the client as a parameter for RestTemplate factory since I want it to be used in the RestTemplate.
Waqas Ali
Updated on July 09, 2022Comments
-
Waqas Ali almost 2 years
I am using apache http client to test my WS. I have write a get WS in jersey. URL for this WS is
http://localhost:8080/mobilestore/rest/sysgestockmobilews/getinventory?xml=dataString
to call this WS using url i have write a method which is as follow
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); } }
Now when i run the program and pass the url to this function i get exception at the line
HttpResponse response = client.execute(request);
Exception is as follow
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)
Now if i use the WS url and hit it using any browser i get the expected result but i want to know what is wrong with my apache http client code..