4.5.2HttpClientUtil

近期给整个系统做了升级后发现框架中httpclient占用系统资源后比重特别大,在各种baidu,google后发现是4.3以下版本的公共问题,因此一狠心升级到了最新的4.5.2。发现之前好多方法都报黄了和出现斜杠了。。。 有洁癖见不得这样的东西出现在框架中因此从新封装了一套。封装的不好,各位大神轻喷。。。直接贴。。。

/**
 * http工具类
 * @author dubl
 * @version 1.0.0 , 2016年12月8日 下午2:28:48
 */
public class HttpClientUtil {

    /** 日志 */
    private static Logger logger = LogManager.getLogger(HttpClientUtil.class.getName());

    /** 请求超时设置*/
    private static RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(15000).setConnectionRequestTimeout(7500).setSocketTimeout(15000).build();

    /** 编码设置*/
    private static final String encoding = "UTF-8";

    /** 请求方式枚举*/
    public static enum httpRequestMethod {
        GET, POST;
    };

    /**
     * 创建HTTPS连接
     * 
     * @return 自动关闭的https连接
     * @throws Exception
     * @author dubl
     */
    public static CloseableHttpClient getHttpsClient() throws Exception {
        CloseableHttpClient httpClient = null;
        // 重写ssl证书校验 do something or do nothing
        TrustManager trustManager = new X509TrustManager() {

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }

            @Override
            public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {

            }

            @Override
            public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {

            }
        };
        try {
            // 开启SSL
            SSLContext sslContext = SSLContext.getInstance("TLS");
            // 初始化ssl校验
            sslContext.init(null, new TrustManager[] { trustManager }, null);
            // 注册ssl链接工厂
            SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext,
                    NoopHostnameVerifier.INSTANCE);
            // 请求配置
            RequestConfig requestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT)
                    .setExpectContinueEnabled(true)
                    .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST))
                    .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC)).build();
            // 链接配置
            Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
                    .register("http", PlainConnectionSocketFactory.INSTANCE).register("https", socketFactory).build();
            // 创建ConnectionManager,添加Connection配置信息
            PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(
                    socketFactoryRegistry);
            // 创建连接
            httpClient = HttpClients.custom().setConnectionManager(connectionManager)
                    .setDefaultRequestConfig(requestConfig).build();
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("创建https连接出错。" + e.getMessage());
        }
        return httpClient;
    }

    /**
     * 发送http请求
     * 
     * @param url 请求地址
     * @param method 请求方式
     * @param params 参数 K-V模式
     * @return 返回结果字符串
     * @throws Exception
     * @author dubl
     */
    public static String sendHttpRequest(String url, httpRequestMethod method, Map<String, String> params) throws Exception {
        CloseableHttpResponse response = null;
        String result = null;
        logger.info(method.name() + ":" + url + "--" + params);
        if (httpRequestMethod.GET == method) {
            response = sendGetRequest(url, params);
        } else if (httpRequestMethod.POST == method) {
            response = sendPostRequest(url, params);
        }
        HttpEntity entity = response.getEntity();
        result = EntityUtils.toString(entity, encoding);
        int statusCode = response.getStatusLine().getStatusCode();
        response.close();
        if (statusCode == HttpStatus.SC_OK) {
            EntityUtils.consume(entity);
            logger.info("HTTP-RESPONSE" + result);
        } else {
            throw new Exception("发送HTTP请求:" + url + "出现异常,返回内容为:" + result);
        }
        return result;
    }

    /**
     * http发送文件
     * 
     * @param url
     *            请求路径
     * @param params
     *            参数
     * @param files
     *            文件集合
     * @return
     * @throws Exception
     * @author dubl
     */
    public static String sendHttpRequestFile(String url, Map<String, String> params, File[] files) throws Exception {
        CloseableHttpClient httpClient = null;
        CloseableHttpResponse response = null;
        String result = null;
        try {
            Charset charset = CharsetUtils.get(encoding);
            // post模式且带上传文件
            httpClient = getHttpClient();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setConfig(requestConfig);
            // 创建提交
            MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
            // 开启浏览器兼容模式
            multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
            // 设置编码集
            multipartEntityBuilder.setCharset(charset);
            // 非文件参数
            for (Map.Entry<String, String> entry : params.entrySet()) {
                StringBody value = new StringBody(entry.getValue(), ContentType.create("text/plain", charset));
                multipartEntityBuilder.addPart(entry.getKey(), value);
            }
            // 文件参数
            for (File file : files) {
                FileBody fileBody = new FileBody(file);
                multipartEntityBuilder.addPart(new String(file.getName().getBytes(), charset), fileBody);
            }
            // httpEntity
            HttpEntity httpEntity = multipartEntityBuilder.build();
            httpPost.setEntity(httpEntity);
            // 执行
            response = httpClient.execute(httpPost);
            // http 状态码
            int statusCode = response.getStatusLine().getStatusCode();
            result = EntityUtils.toString(response.getEntity(), Consts.UTF_8);
            if (statusCode != HttpStatus.SC_OK) {
                throw new Exception("发送HTTP-FILE请求:" + url + "出现异常,返回内容为:" + result);
            }
        } catch (Exception e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);
            throw new Exception(e.getMessage(), e);
        } finally {
            response.close();
            httpClient.close();
        }
        return result;
    }

    /**
     * 获取http连接
     * 
     * @return
     * @throws Exception
     * @author dubl
     */
    public static CloseableHttpClient getHttpClient() throws Exception {
        CloseableHttpClient httpClient = null;
        try {
            // 创建连接
            httpClient = HttpClients.createDefault();
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("创建http连接出错。" + e.getMessage());
        }
        return httpClient;
    }

    /**
     * 发送get请求
     * 
     * @param url
     * @param method
     * @param params
     * @return
     * @throws Exception
     */
    private static CloseableHttpResponse sendGetRequest(String url, Map<String, String> params) throws Exception {
        HttpGet httpGet = new HttpGet();
        httpGet.setConfig(requestConfig);
        if (params != null && params.size() > 0) {
            // 组装get 带参url
            StringBuffer urlParams = new StringBuffer(url + "?");
            for (Map.Entry<String, String> entry : params.entrySet()) {
                if (urlParams.toString().endsWith("?")) {
                    urlParams.append(entry.getKey() + "=" + entry.getValue());
                } else {
                    urlParams.append("&" + entry.getKey() + "=" + entry.getValue());
                }
            }
            httpGet.setURI(new URI(urlParams.toString()));
        } else {
            httpGet.setURI(new URI(url));
        }
        return getHttpClient().execute(httpGet);
    }

    /**
     * 发送post请求
     * 
     * @param url
     * @param method
     * @param params
     * @return
     * @throws Exception
     */
    private static CloseableHttpResponse sendPostRequest(String url, Map<String, String> params) throws Exception {
        HttpPost httpPost = new HttpPost(url);
        httpPost.setConfig(requestConfig);
        if (params != null && params.size() > 0) {
            List<NameValuePair> nvpList = new ArrayList<NameValuePair>();
            for (Map.Entry<String, String> entry : params.entrySet()) {
                nvpList.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
            }
            httpPost.setEntity(new UrlEncodedFormEntity(nvpList, encoding));
        }

        return getHttpClient().execute(httpPost);
    }

    /**
     * 获取request的IP地址
     * 
     * @param request
     * @return
     * @throws Exception
     * @author dubl
     */
    public static String getRequestIp(HttpServletRequest request) throws Exception {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip;
    }
}

欢迎指教~
参考资料
起个名忒难-httpclient 4.5.2 学习随笔(1)
起个名忒难-httpclient 4.5.2 学习随笔(2)
起个名忒难httpclient 4.5.2 学习随笔(3)
使用HttpClient实现文件的上传下载 - lijin1185374093 - 博客园
blog.csdn.net/comven2/article/details/52180620

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 时常在一首老歌里打漩儿,循环播放还是百听不厌,会在一句歌词里思考,也会在歌词里把记忆拉长,还会在未知的空间里让思维...
    静华2016阅读 397评论 13 9
  • 色彩模式解析 色彩模式(颜色模式):用数字表示颜色的一种算法,是用来显示和打印图像的颜色模型。 常用的色彩模式有:...
    委婉的鱼阅读 6,108评论 22 236
  • 晚上写作业,因为你写的不认真,妈妈总是用橡皮给你擦了重写,你撅着嘴一遍遍的写着。最近学习的生字,你记的倒是...
    梓浩妈妈阅读 80评论 0 0