HttpClient实现HTTP请求

1:开发环境

JDK1.8、Springboot

2:项目依赖

"org.apache.httpcomponents:httpclient:4.5.10"

3:代码详细

package com.nobody.utils;

import java.net.URI;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

public class HttpClientUtil {

    private static final Logger LOGGER = LoggerFactory.getLogger(HttpClientUtil.class);

    private static final String STANDARD_CHARSET = "UTF-8";

    /**
     * GET 若有参则直接拼接URL
     * 
     * @param headers 请求头参数
     * @param params 请求参数
     * @param url 请求地址
     * @param timeOutInMillis 超时时间(毫秒)
     * @return
     */
    public static String doGet(Map<String, Object> headers, Map<String, Object> params, String url,
            int timeOutInMillis) {

        // 返回结果
        String result = null;

        // 创建Http客户端
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        // 创建Get请求
        HttpGet httpGet = null;

        try {
            // 请求参数处理(拼接前先将请求参数值encoding,处理一些特殊字符)
            if (!CollectionUtils.isEmpty(params)) {
                StringBuffer sb = new StringBuffer();
                for (String key : params.keySet()) {
                    sb.append(key).append("=")
                            .append(URLEncoder.encode(params.get(key).toString(), STANDARD_CHARSET))
                            .append("&");
                }
                String handledParams = sb.substring(0, sb.length() - 1).toString();
                httpGet = new HttpGet(url + "?" + handledParams);
            } else {
                httpGet = new HttpGet(url);
            }

            // 请求头处理
            if (!CollectionUtils.isEmpty(headers)) {
                Set<String> set = headers.keySet();
                Iterator<String> it = set.iterator();
                while (it.hasNext()) {
                    String key = it.next();
                    if (null != headers.get(key)) {
                        httpGet.addHeader(key, headers.get(key).toString());
                    }
                }
            }

            // 设置数据读取超时时间,传输超时时间,链接请求超时时间
            if (timeOutInMillis > 0) {
                RequestConfig requestConfig = RequestConfig.custom()
                        .setSocketTimeout(timeOutInMillis).setConnectTimeout(timeOutInMillis)
                        .setConnectionRequestTimeout(timeOutInMillis).build();
                httpGet.setConfig(requestConfig);
            }

            // 客户端发送请求并获得响应模型
            CloseableHttpResponse response = httpClient.execute(httpGet);
            // 从响应模型中获取响应实体
            HttpEntity responseEntity = response.getEntity();
            if (null != responseEntity) {
                result = EntityUtils.toString(responseEntity, STANDARD_CHARSET);
            }
        } catch (

        Exception ex) {
            LOGGER.error("doGet error:", ex);
        } finally {
            // 释放资源
            httpGet.abort();
            if (null != httpClient) {
                try {
                    httpClient.close();
                } catch (Exception ex) {
                    LOGGER.error("doGet httpClient close error:", ex);
                }
            }
        }

        return result;
    }

    /**
     * GET 若有参形式(使用URI获得HttpGet)
     * 
     * @param headers 请求头参数
     * @param params 请求参数
     * @param scheme 请求协议
     * @param host 请求IP
     * @param port 请求端口
     * @param path 请求路径
     * @param timeOutInMillis 超时时间(毫秒)
     * @return
     */
    public static String doGet(Map<String, Object> headers, Map<String, Object> params,
            final String scheme, final String host, final int port, final String path,
            int timeOutInMillis) {

        // 返回结果
        String result = null;

        // 创建Http客户端
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        // 创建Get请求
        HttpGet httpGet = null;

        try {
            URI uri = null;
            URIBuilder ub =
                    new URIBuilder().setScheme(scheme).setHost(host).setPort(port).setPath(path);
            // 请求参数处理
            if (!CollectionUtils.isEmpty(params)) {
                List<NameValuePair> nvps = new ArrayList<>();
                for (String key : params.keySet()) {
                    nvps.add(new BasicNameValuePair(key, params.get(key).toString()));
                }
                ub.setParameters(nvps);
            }
            uri = ub.build();

            httpGet = new HttpGet(uri);

            if (!CollectionUtils.isEmpty(headers)) {
                Set<String> set = headers.keySet();
                Iterator<String> it = set.iterator();
                while (it.hasNext()) {
                    String key = it.next();
                    if (null != headers.get(key)) {
                        httpGet.addHeader(key, headers.get(key).toString());
                    }
                }
            }

            // 设置数据读取超时时间,传输超时时间,链接请求超时时间
            if (timeOutInMillis > 0) {
                RequestConfig requestConfig = RequestConfig.custom()
                        .setSocketTimeout(timeOutInMillis).setConnectTimeout(timeOutInMillis)
                        .setConnectionRequestTimeout(timeOutInMillis).build();
                httpGet.setConfig(requestConfig);
            }

            // 客户端发送请求并获得响应模型
            CloseableHttpResponse response = httpClient.execute(httpGet);
            // 从响应模型中获取响应实体
            HttpEntity responseEntity = response.getEntity();
            if (null != responseEntity) {
                result = EntityUtils.toString(responseEntity, STANDARD_CHARSET);
            }
        } catch (Exception ex) {
            LOGGER.error("doGet error:", ex);
        } finally {
            // 释放资源
            httpGet.abort();
            if (null != httpClient) {
                try {
                    httpClient.close();
                } catch (Exception ex) {
                    LOGGER.error("doGet httpClient close error:", ex);
                }
            }
        }

        return result;
    }

    /**
     * POST application/x-www-form-urlencoded形式
     * 
     * @param headers 请求头参数
     * @param params 请求参数
     * @param url 请求地址
     * @param timeOutInMillis 超时时间(毫秒)
     * @return
     */
    public static String doPost(String url, Map<String, Object> headers, Map<String, Object> params,
            int timeOutInMillis) {

        // 返回结果
        String result = null;

        // 创建Http客户端
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        // 创建Get请求
        HttpPost httpPost = null;

        try {
            // 请求参数处理(拼接前先将请求参数值encoding,处理一些特殊字符)
            if (!CollectionUtils.isEmpty(params)) {
                StringBuffer sb = new StringBuffer();
                for (String key : params.keySet()) {
                    sb.append(key).append("=")
                            .append(URLEncoder.encode(params.get(key).toString(), STANDARD_CHARSET))
                            .append("&");
                }
                String handledParams = sb.substring(0, sb.length() - 1).toString();
                httpPost = new HttpPost(url + "?" + handledParams);
            } else {
                httpPost = new HttpPost(url);
            }

            // 请求头处理
            if (!CollectionUtils.isEmpty(headers)) {
                Set<String> set = headers.keySet();
                Iterator<String> it = set.iterator();
                while (it.hasNext()) {
                    String key = it.next();
                    if (null != headers.get(key)) {
                        httpPost.addHeader(key, headers.get(key).toString());
                    }
                }
            }

            // 设置数据读取超时时间,传输超时时间,链接请求超时时间
            if (timeOutInMillis > 0) {
                RequestConfig requestConfig = RequestConfig.custom()
                        .setSocketTimeout(timeOutInMillis).setConnectTimeout(timeOutInMillis)
                        .setConnectionRequestTimeout(timeOutInMillis).build();
                httpPost.setConfig(requestConfig);
            }

            // 客户端发送请求并获得响应模型
            CloseableHttpResponse response = httpClient.execute(httpPost);
            // 从响应模型中获取响应实体
            HttpEntity responseEntity = response.getEntity();
            if (null != responseEntity) {
                result = EntityUtils.toString(responseEntity, STANDARD_CHARSET);
            }
        } catch (Exception ex) {
            LOGGER.error("doPost error:", ex);
        } finally {
            // 释放资源
            httpPost.abort();
            if (null != httpClient) {
                try {
                    httpClient.close();
                } catch (Exception ex) {
                    LOGGER.error("doPost httpClient close error:", ex);
                }
            }
        }

        return result;
    }

    /**
     * POST application/x-www-form-urlencoded形式(NameValuePair参数形式)
     * 
     * @param headers 请求头参数
     * @param params 请求参数
     * @param url 请求地址
     * @param timeOutInMillis 超时时间(毫秒)
     * @return
     */
    public static String doPostByNvp(String url, Map<String, Object> headers,
            Map<String, Object> params, int timeOutInMillis) {

        // 返回结果
        String result = null;

        // 创建Http客户端
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        // 创建Get请求
        HttpPost httpPost = null;

        try {

            httpPost = new HttpPost(url);

            // 请求参数处理
            if (!CollectionUtils.isEmpty(params)) {
                List<NameValuePair> nvps = new ArrayList<>();
                for (String key : params.keySet()) {
                    nvps.add(new BasicNameValuePair(key, params.get(key).toString()));
                }
                httpPost.setEntity(new UrlEncodedFormEntity(nvps, STANDARD_CHARSET));
            }

            // 请求头处理
            if (!CollectionUtils.isEmpty(headers)) {
                Set<String> set = headers.keySet();
                Iterator<String> it = set.iterator();
                while (it.hasNext()) {
                    String key = it.next();
                    if (null != headers.get(key)) {
                        httpPost.addHeader(key, headers.get(key).toString());
                    }
                }
            }

            // 设置数据读取超时时间,传输超时时间,链接请求超时时间
            if (timeOutInMillis > 0) {
                RequestConfig requestConfig = RequestConfig.custom()
                        .setSocketTimeout(timeOutInMillis).setConnectTimeout(timeOutInMillis)
                        .setConnectionRequestTimeout(timeOutInMillis).build();
                httpPost.setConfig(requestConfig);
            }

            // 客户端发送请求并获得响应模型
            CloseableHttpResponse response = httpClient.execute(httpPost);
            // 从响应模型中获取响应实体
            HttpEntity responseEntity = response.getEntity();
            if (null != responseEntity) {
                result = EntityUtils.toString(responseEntity, STANDARD_CHARSET);
            }
        } catch (Exception ex) {
            LOGGER.error("doPost error:", ex);
        } finally {
            // 释放资源
            httpPost.abort();
            if (null != httpClient) {
                try {
                    httpClient.close();
                } catch (Exception ex) {
                    LOGGER.error("doPost httpClient close error:", ex);
                }
            }
        }

        return result;
    }

    /**
     * POST application/json形式
     * 
     * @param headers 请求头参数
     * @param jsonObject 请求对象参数
     * @param url 请求地址
     * @param timeOutInMillis 超时时间(毫秒)
     * @return
     */
    public static String doPost(Map<String, Object> headers, String jsonObject, String url,
            int timeOutInMillis) {

        // 返回结果
        String result = null;

        // 创建Http客户端
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        // 创建Get请求
        HttpPost httpPost = null;

        try {

            httpPost = new HttpPost(url);

            // 请求参数处理
            if (!StringUtils.isEmpty(jsonObject)) {
                StringEntity entity = new StringEntity(jsonObject, STANDARD_CHARSET);
                httpPost.setEntity(entity);
                // httpPost.addHeader("Content-Type", ContentType.APPLICATION_JSON.getMimeType());
            }

            // 请求头处理
            if (!CollectionUtils.isEmpty(headers)) {
                Set<String> set = headers.keySet();
                Iterator<String> it = set.iterator();
                while (it.hasNext()) {
                    String key = it.next();
                    if (null != headers.get(key)) {
                        httpPost.addHeader(key, headers.get(key).toString());
                    }
                }
            }

            // 设置数据读取超时时间,传输超时时间,链接请求超时时间
            if (timeOutInMillis > 0) {
                RequestConfig requestConfig = RequestConfig.custom()
                        .setSocketTimeout(timeOutInMillis).setConnectTimeout(timeOutInMillis)
                        .setConnectionRequestTimeout(timeOutInMillis).build();
                httpPost.setConfig(requestConfig);
            }

            // 客户端发送请求并获得响应模型
            CloseableHttpResponse response = httpClient.execute(httpPost);
            // 从响应模型中获取响应实体
            HttpEntity responseEntity = response.getEntity();
            if (null != responseEntity) {
                result = EntityUtils.toString(responseEntity, STANDARD_CHARSET);
            }
        } catch (Exception ex) {
            LOGGER.error("doPost error:", ex);
        } finally {
            // 释放资源
            httpPost.abort();
            if (null != httpClient) {
                try {
                    httpClient.close();
                } catch (Exception ex) {
                    LOGGER.error("doPost httpClient close error:", ex);
                }
            }
        }

        return result;
    }

}

猜你喜欢

转载自blog.csdn.net/chenlixiao007/article/details/103975057