apache http客户端org.apache.http.NoHttpResponseException:目标服务器响应失败

Posted

技术标签:

【中文标题】apache http客户端org.apache.http.NoHttpResponseException:目标服务器响应失败【英文标题】:apache http client org.apache.http.NoHttpResponseException: The target server failed to respond 【发布时间】:2013-08-14 16:40:49 【问题描述】:

我正在使用 apache http 客户端来测试我的 WS。我在球衣上写了一个get WS。此 WS 的 URL 是

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

要使用 url 调用这个 WS,我编写了一个方法如下

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


现在当我运行程序并将 url 传递给这个函数时,我在该行得到异常

HttpResponse response = client.execute(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
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)

现在,如果我使用 WS url 并使用任何浏览器点击它,我会得到预期的结果,但我想知道我的 apache http 客户端代码有什么问题..

【问题讨论】:

这里发布了同样的问题:***.com/questions/10558791/… 【参考方案1】:

我浏览了这里的链接并得到了这个答案: get NoHttpResponseException for load testing

这让我走上了正轨。在这里更新一下答案是使用当前 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();

我也在那里使用 spring-web,所以我使用客户端作为 RestTemplate 工厂的参数,因为我希望它在 RestTemplate 中使用。

【讨论】:

以上是关于apache http客户端org.apache.http.NoHttpResponseException:目标服务器响应失败的主要内容,如果未能解决你的问题,请参考以下文章

org.apache.http.conn.HttpHostConnectException:拒绝连接到http://172.20.38.143

Apache HTTP 客户端 loadTrustMaterial 不起作用

apache http客户端中的异常

Spring集成Solr 客户端,提示如下错误信息:java.lang.NoClassDefFoundError: org/apache/http/message/TokenParser

JMeter报Non HTTP response code: org.apache.http.conn.HttpHostConnectException

Android 1.6 中捆绑了哪个版本的 Apache HTTP 客户端?