技匠志程序员

4.5.2HttpClientUtil

2016-12-12  本文已影响90人  Super_心总

近期给整个系统做了升级后发现框架中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

上一篇下一篇

猜你喜欢

热点阅读