首页 > 解决方案 > HttpClient URL 调用失败

问题描述

我正在尝试从 linux 机器对 API 进行 Http POST。但是我对 URL 的调用失败并出现超时错误。我为此使用 httpclient-4.5.8 库。背景:最初我的客户端服务器没有被列入白名单,所以我曾经从 URL 中获取“403-Forbidden”。但是加入白名单后会出现超时错误。

public void PostMessage() {     
    try {

        final RequestConfig params = RequestConfig.custom().setConnectTimeout(3000).setSocketTimeout(3000).build();
        httpPost = new HttpPost(getUri());
        log4.debug("URL set up done for "+ httpPost.getURI());
        final StringEntity entity = new StringEntity(getMessage());
        httpPost.setConfig(params);
        httpPost.setEntity(entity);
        httpPost.setHeader("Content-type", "application/json");


        CloseableHttpResponse response = (CloseableHttpResponse) client.execute(httpPost);
        log4.info("Response Code:" + response.getStatusLine().getStatusCode());
        BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        String line = "";
        while ((line = rd.readLine()) != null) {
            log4.info("Response Content:" + line);
        }
        } catch (IOException i) {
            log4.info("Error at PostClient.IOException. " + i.getMessage());
        } catch(Exception e) {
            log4.info("Error at PostClient.Exception. " + e.getMessage());
        }
}

日志跟踪:(请原谅屏蔽)

"message":"为https://ABCD.com/完成 URL 设置","logger":"com.tesco.ReceiptClient.PublishClient.ReceiptPostClient:PostMessage"

"message":"CookieSpec selected: default","logger":"org.apache.http.client.protocol.RequestAddCookies:process"

"message":"上下文中未设置授权缓存","logger":"org.apache.http.client.protocol.RequestAuthCache:process"

"message":"连接请求:[路由:{s}-> https://ABCD.com:443 ][保持活动的总数:0;分配的路由:2 个中的 0 个;分配的总数:20 个中的 0 个]",记录器":"org.apache.http.impl.conn.PoolingHttpClientConnectionManager:requestConnection"

“消息”:“连接租用:[id:1][路由:{s}-> https://ABCD.com:443 ][保持活动的总数:0;分配的路由:2 个中的 1 个;分配的总数:1 个20]","记录器":"org.apache.http.impl.conn.PoolingHttpClientConnectionManager:leaseConnection"

"message":"打开连接 {s}-> https://ABCD.com:443 ","logger":"org.apache.http.impl.execchain.MainClientExec:execute"

"message":"正在连接到 ABCD.com/xxx.xx.xx.x:443","logger":"org.apache.http.impl.conn.DefaultHttpClientConnectionOperator:connect"

"message":"连接套接字到 ABCD.com/xxx.xx.xx.x:443 超时 3000","logger":"org.apache.http.conn.ssl.SSLConnectionSocketFactory:connectSocket"

“消息”:“http-outgoing-1:关闭连接”,“记录器”:“org.apache.http.impl.conn.LoggingManagedHttpClientConnection:shutdown”

“消息”:“连接丢弃”,“记录器”:“org.apache.http.impl.execchain.ConnectionHolder:abortConnection”

"message":"连接释放:[id: 2][路由:{s}-> https://ABCD.com:443 ][保持活动的总数:0;分配的路由:2 个中的 0 个;分配的总数:0 个20]","记录器":"org.apache.http.impl.conn.PoolingHttpClientConnectionManager:releaseConnection"

"message":"PostClient.IOException 出错。连接到 ABCD.com:443 [ABCD.com/xxx.xx.xx.x] 失败:连接超时","logger":"com.tesco.ReceiptClient.PublishClient .ReceiptPostClient:PostMessage"

标签: javaapache-httpclient-4.x

解决方案


检查是否有与服务器的连接(telnet/ping)。

通常,当您与服务器没有任何连接时,您将收到连接超时错误如果服务器花费的时间比“read-timeout”配置给出的时间更长,则会出现读取超时。


推荐阅读