• HttpClient设置超时(转)


    HttpClient  4.5版本设置连接超时时间-CloseableHttpClient设置Timeout(区别于4.3.2)

    HttpClient升级到4.5版本后,API有很多变化,HttpClient 4之后,API一直没有太稳定,我感觉4.5版本抽象后,很多API应该快稳定了。

           使用HttpClient,一般都需要设置连接超时时间和获取数据超时时间。这两个参数很重要,目的是为了防止访问其他http时,由于超时导致自己的应用受影响。

           4.5版本中,这两个参数的设置都抽象到了RequestConfig中,由相应的Builder构建,具体的例子如下:

    [java] view plain copy
     
    1. <code class="hljs go" style="font-family:'Courier New',Courier,monospace; font-size:1em">CloseableHttpClient httpclient = HttpClients.createDefault();    
    2. HttpGet httpGet = new HttpGet("http://stackoverflow.com/");    
    3. RequestConfig requestConfig = RequestConfig.custom()    
    4.         .setConnectTimeout(5000).setConnectionRequestTimeout(1000)    
    5.         .setSocketTimeout(5000).build();    
    6. httpGet.setConfig(requestConfig);    
    7. CloseableHttpResponse response = httpclient.execute(httpGet);    
    8. System.out.println("得到的结果:" + response.getStatusLine());//得到请求结果    
    9. HttpEntity entity = response.getEntity();//得到请求回来的数据</code>  

    setConnectTimeout:设置连接超时时间,单位毫秒。

    setConnectionRequestTimeout:设置从connect Manager获取Connection 超时时间,单位毫秒。这个属性是新加的属性,因为目前版本是可以共享连接池的。

    setSocketTimeout:请求获取数据的超时时间,单位毫秒。 如果访问一个接口,多少时间内无法返回数据,就直接放弃此次调用。

    ===========================================

    昨天遇到一个问题需要设置CloseableHttpClient的超时时间,查了官方文档如下。

    新建一个RequestConfig:

    RequestConfig defaultRequestConfig = RequestConfig.custom()
        .setSocketTimeout(5000)
        .setConnectTimeout(5000)
        .setConnectionRequestTimeout(5000)
        .setStaleConnectionCheckEnabled(true)
        .build();
    

    这个超时可以设置为客户端级别,作为所有请求的默认值:

    CloseableHttpClient httpclient = HttpClients.custom()
        .setDefaultRequestConfig(defaultRequestConfig)
        .build();
    

    Request不会继承客户端级别的请求配置,所以在自定义Request的时候,需要将客户端的默认配置拷贝过去:

     
    HttpGet httpget = new HttpGet("http://www.apache.org/");
    RequestConfig requestConfig = RequestConfig.copy(defaultRequestConfig)
        .setProxy(new HttpHost("myotherproxy", 8080))
        .build();
    httpget.setConfig(requestConfig);

     伦理片 http://www.dotdy.com/  

    4.3版本的超时是这样的:

    public static String httpPost(String url, String jsonString) {
        // 设置HTTP请求参数
    String result = null;
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        try {
            httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000);//设置请求超时时间 10s
    StringEntity entity = new StringEntity(jsonString);
            entity.setContentEncoding("UTF-8");
            entity.setContentType("application/json");
            httpPost.setEntity(entity);
            HttpEntity resEntity = httpClient.execute(httpPost).getEntity();
            result = EntityUtils.toString(resEntity, "UTF-8");
        } catch (Exception e) {
            logger.error("http接口调用异常:url is::" + url, e);
            return null;
        } finally {
            httpClient.getConnectionManager().shutdown();
        }
        return result;
    }

    4.5.2版本是这样的:

     public static String testTimeout(String url) {

            // 设置HTTP请求参数

            String result = null;

            CloseableHttpClient client = HttpClients.createDefault();

            HttpGet httpGet = new HttpGet(url);

            RequestConfig requestConfig = RequestConfig.custom()

                    .setConnectTimeout(50000).setConnectionRequestTimeout(10000)

                    .setSocketTimeout(50000).build();

            httpGet.setConfig(requestConfig);

            try {

                CloseableHttpResponse response = client.execute(httpGet);

                result = EntityUtils.toString(response.getEntity(), "UTF-8");

            } catch (ClientProtocolException e) {

                logger.error("http接口调用异常:url is::" + url, e);

                return null;

            } catch (Exception e) {

                logger.error("http接口调用异常:url is::" + url, e);

                return null;

            } finally {

                try {

                    client.close();

                } catch (IOException e) {

                    logger.error("http接口调用异常:url is::" + url, e);

                }

            }

            return result;

        }

    转自:http://blog.csdn.net/h254532699/article/details/54342470

  • 相关阅读:
    C# 串口通信总结
    客户端下载文件和服务器端下载文件总结
    Android 上传图片到 Asp.Net 服务器的问题
    iOS内存泄漏自动检测工具PLeakSniffer
    让iOS开发变得更有效率-分类、工具类
    分分钟解决iOS开发中App启动广告的功能
    响应者链及相关机制总结
    stackoverflow上关于iOS的票数最多(最常见)的15个问题
    iOS 开发之 ReactiveCocoa(进阶)
    iOS 开发之 ReactiveCocoa(基础)
  • 原文地址:https://www.cnblogs.com/flying607/p/7403168.html
Copyright © 2020-2023  润新知