httpclient工具类封装

使用httpclient作为http客户端时,通常我们都会做一些封装,方便在项目中使用,下面是我自己在平时使用中对它的封装工具类,首先需要引入相关的依赖:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.12</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpmime</artifactId>
    <version>4.5.12</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcore</artifactId>
    <version>4.4.13</version>
</dependency>

这里要注意引入的依赖版本关系要对应,否则请求时会报错,

下面再封装一个返回数据实体类,用于响应数据的返回:

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * http请求返回信息对象
 *
 * @author xingo
 * @date 2020/6/8
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class HttpResult {

	private int status;		// http返回状态码
	private String body;	// http返回体
	private String error;	// 异常信息
	private byte[] bytes;   // 返回原始字节数据
}

http常用方法工具类封装:

import org.apache.http.*;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.config.RequestConfig.Builder;
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.protocol.HttpClientContext;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.conn.UnsupportedSchemeException;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HttpContext;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.util.EntityUtils;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import java.io.*;
import java.net.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * http请求工具类(单例模式)
 *
 * @author xingo
 * @date 2020/6/8
 */
public class HttpUtils {

    /**
     * http协议
     */
    private static final String HTTP = "http";
    /**
     * https协议
     */
    private static final String HTTPS = "https";
    /**
     * 默认编码:UTF-8
     */
    private static final String CHAR_SET = "UTF-8";
    /**
     * 默认超时时间(毫秒)
     */
    private static final int DEFAULT_TIMEOUT = 3000;
    /**
     * 默认重试时间间隔
     */
    private static final int WAIT_TIME = 1000;
    /**
     * 连接池大小
     */
    private static final int POOL_MAX_SIZE = 500;
    /**
     * 每个线路上连接大小
     */
    private static final int PER_ROUTE_MAX_SIZE = 200;
    /**
     * 失败重试次数
     */
    private static final int RETRY_TIMES = 5;

    private HttpUtils() {

    }

    /**
     * 单例对象
     */
    private volatile static HttpUtils instance = null;

    public static HttpUtils getInstance() {
        if (instance == null) {
            synchronized (HttpUtils.class) {
                if (instance == null) {
                    instance = new HttpUtils();
                }
            }
        }

        return instance;
    }

    private volatile CloseableHttpClient hc = null;

    private CloseableHttpClient getHttpClient() {
        if (hc == null) {
            synchronized (HttpUtils.class) {
                if (hc == null) {
                    try {
                        // 重试配置
                        HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() {

                            @Override
                            public boolean retryRequest(IOException e, int count, HttpContext context) {
                                System.out.println("连接失败次数|" + count);
                                e.printStackTrace();

                                if (count >= RETRY_TIMES) {       // 达到最大重试次数就放弃
                                    return false;
                                }
                                // 返回true需要重试
                                if (e instanceof NoHttpResponseException            // 请求无响应就重试
                                        || e instanceof ConnectTimeoutException     // 连接超时
                                        || e instanceof SocketException             // 连接异常
                                        || e instanceof SocketTimeoutException      // socket超时
                                ) {
                                    try {
                                        // 重试延迟时间:1s
                                        TimeUnit.MILLISECONDS.sleep(WAIT_TIME);
                                    } catch (InterruptedException ex) {
                                        ex.printStackTrace();
                                    }
                                    return true;
                                }
                                // 返回false不需要重试
                                if (e instanceof SSLException                       // SSL握手异常不要重试
                                    || e instanceof InterruptedIOException          // 中断
                                    || e instanceof UnknownHostException            // 目标server不可达
                                    || e instanceof UnsupportedSchemeException      // 未配置协议
                                ) {
                                    return false;
                                }

                                HttpClientContext clientContext = HttpClientContext.adapt(context);
                                HttpRequest request = clientContext.getRequest();
                                // 假设请求是幂等的,就再次尝试
                                return !(request instanceof HttpEntityEnclosingRequest);
                            }
                        };

//                        // 设置信任ssl访问:方式1
//                        SSLContext sslContext = SSLContext.getInstance("SSL");
//                        X509TrustManager tm = new X509TrustManager() {
//                            @Override
//                            public void checkClientTrusted(X509Certificate[] xcs, String string) {
//                            }
//
//                            @Override
//                            public void checkServerTrusted(X509Certificate[] xcs, String string) {
//                            }
//
//                            @Override
//                            public X509Certificate[] getAcceptedIssuers() {
//                                return null;
//                            }
//                        };
//                        sslContext.init(null, new TrustManager[]{ tm }, null);
                        // 设置信任ssl访问:方式2
                        SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (chain, authType) -> true).build();

                        Registry<ConnectionSocketFactory> sf = RegistryBuilder
                                .<ConnectionSocketFactory>create()
                                .register(HTTP, PlainConnectionSocketFactory.INSTANCE)
                                .register(HTTPS, SSLConnectionSocketFactory.getSocketFactory())
//                                .register(HTTPS, new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE))
//                                .register(HTTPS, new SSLConnectionSocketFactory(sslContext))
                                .build();

                        // 连接池配置
                        PoolingHttpClientConnectionManager poolingManager = new PoolingHttpClientConnectionManager(sf);
                        // 最大连接数
                        poolingManager.setMaxTotal(POOL_MAX_SIZE);
                        // 每个路由最大连接数
                        poolingManager.setDefaultMaxPerRoute(PER_ROUTE_MAX_SIZE);

                        // 超时配置
                        RequestConfig defaultConfig = RequestConfig.custom()
                                .setConnectionRequestTimeout(DEFAULT_TIMEOUT)
                                .setConnectTimeout(DEFAULT_TIMEOUT)
                                .setSocketTimeout(DEFAULT_TIMEOUT)
                                .build();

                        hc = HttpClients.custom()
                                .setConnectionManager(poolingManager)
                                .setDefaultRequestConfig(defaultConfig)
                                .setRetryHandler(retryHandler)
                                .setSSLContext(sslContext)
                                .build();

//                       hc = HttpClientBuilder
//                                .create()
//                                .setConnectionManager(poolingManager)
//                                .setDefaultRequestConfig(defaultConfig)
//                                .setRetryHandler(retryHandler)
//                                .setSSLContext(sslContext)
//                                .build();
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }
        }

        return hc;
    }

    /**
     * 请求配置信息
     *
     * @param socketTime    等待服务器响应超时时间
     * @param connTime      连接建立超时时间,也就是三次握手完成时间
     * @param connReqTime   获取连接超时时间,httpclient使用池化管理,如果连接池中的连接都被占用了且超过该时间还没有获取到连接就会抛出异常
     * @return
     */
    private RequestConfig getRequestConfig(int socketTime, int connTime, int connReqTime) {
        Builder config = RequestConfig.custom();
        if (connReqTime > 0) {
            config.setConnectionRequestTimeout(connReqTime);
        } else {
            config.setConnectionRequestTimeout(DEFAULT_TIMEOUT);
        }
        if (connTime > 0) {
            config.setConnectTimeout(connTime);
        } else {
            config.setConnectTimeout(DEFAULT_TIMEOUT);
        }
        if (socketTime > 0) {
            config.setSocketTimeout(socketTime);
        } else {
            config.setSocketTimeout(DEFAULT_TIMEOUT);
        }

        return config.build();
    }

    /**
     * 发送post请求
     *
     * @param url    请求URL地址
     * @param params 请求参数
     * @return
     */
    public HttpResult doPost(String url, Map<String, Object> params) {
        return this.doPost(url, null, params, CHAR_SET, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT);
    }

    /**
     * 发送post请求
     *
     * @param url           请求URL地址
     * @param params        请求参数
     * @param socketTime    等待响应超时时间
     * @return
     */
    public HttpResult doPost(String url, Map<String, Object> params, int socketTime) {
        return this.doPost(url, null, params, CHAR_SET, socketTime, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT);
    }

    /**
     * 发送post请求
     *
     * @param url     请求URL地址
     * @param headers 请求头部
     * @param params  请求参数
     * @return
     */
    public HttpResult doPost(String url, Map<String, String> headers, Map<String, Object> params) {
        return this.doPost(url, headers, params, CHAR_SET, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT);
    }

    /**
     * 发送post请求
     *
     * @param url           请求URL地址
     * @param headers       请求头部
     * @param params        请求参数
     * @param socketTime    等待响应超时时间
     * @return
     */
    public HttpResult doPost(String url, Map<String, String> headers, Map<String, Object> params, int socketTime) {
        return this.doPost(url, headers, params, CHAR_SET, socketTime, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT);
    }

    /**
     * 发送post请求
     *
     * @param url               请求地址
     * @param headers           请求头部
     * @param params            请求参数
     * @param charset           编码
     * @param socketTime        等待响应超时时间
     * @param connTime          建立连接超时时间
     * @param connReqTime       获取连接超时时间
     * @return
     */
    public HttpResult doPost(String url, Map<String, String> headers, Map<String, Object> params, String charset, int socketTime, int connTime, int connReqTime) {
        if (url == null || "".equals(url)) {
            return HttpResult.builder().status(-1).error("url为空").build();
        }

        CloseableHttpClient hc = this.getHttpClient();
        CloseableHttpResponse response = null;
        try {
            HttpPost hpost = new HttpPost(url);
            // 默认超时时间
            hpost.setConfig(this.getRequestConfig(socketTime, connTime, connReqTime));

            if (headers != null && !headers.isEmpty()) {
                for (String key : headers.keySet()) {
                    String val = headers.get(key);
                    if (key != null && !"".equals(key) && val != null && !"".equals(val)) {
                        hpost.setHeader(key, val);
                    }
                }
            }

            if (params != null && !params.isEmpty()) {
                List<NameValuePair> param = new ArrayList<>();
                for (String key : params.keySet()) {
                    if (key != null && !"".equals(key) && params.get(key) != null) {
                        param.add(new BasicNameValuePair(key, params.get(key).toString()));
                    }
                }
                //设置字符集
                HttpEntity httpEntity = new UrlEncodedFormEntity(param, charset);
                //添加参数
                hpost.setEntity(httpEntity);
            }
            response = hc.execute(hpost);

            HttpEntity entity = response.getEntity();
            String data = EntityUtils.toString(entity, charset);
            EntityUtils.consume(entity);
            return HttpResult.builder().status(response.getStatusLine().getStatusCode()).body(data).build();
        } catch (Exception e) {
            e.printStackTrace();
            return HttpResult.builder().status(-1).body(e.getMessage()).build();
        } finally {
            try {
                if(response != null) response.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 发送json数据
     *
     * @param url  请求地址
     * @param json 请求json数据
     * @return
     */
    public HttpResult postJson(String url, String json) {
        return this.postJson(url, null, json, CHAR_SET, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT);
    }

    /**
     * 发送json数据
     *
     * @param url           请求地址
     * @param json          请求json数据
     * @param socketTime    等待响应超时时间
     * @return
     */
    public HttpResult postJson(String url, String json, int socketTime) {
        return this.postJson(url, null, json, CHAR_SET, socketTime, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT);
    }

    /**
     * 发送JSON数据
     *
     * @param url     请求地址
     * @param headers 请求头部
     * @param json    请求json数据
     * @return
     */
    public HttpResult postJson(String url, Map<String, String> headers, String json) {
        return this.postJson(url, headers, json, CHAR_SET, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT);
    }

    /**
     * 发送JSON数据
     *
     * @param url           请求地址
     * @param headers       请求头部
     * @param json          请求json数据
     * @param socketTime    等待响应超时时间
     * @return
     */
    public HttpResult postJson(String url, Map<String, String> headers, String json, int socketTime) {
        return this.postJson(url, headers, json, CHAR_SET, socketTime, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT);
    }

    /**
     * 发送json请求
     *
     * @param url               请求地址
     * @param headers           请求头部
     * @param json              请求json数据
     * @param charset           编码
     * @param socketTime        等待响应超时时间
     * @param connTime          建立连接超时时间
     * @param connReqTime       获取连接超时时间
     * @return
     */
    public HttpResult postJson(String url, Map<String, String> headers, String json, String charset, int socketTime, int connTime, int connReqTime) {
        if (url == null || "".equals(url)) {
            return HttpResult.builder().status(-1).error("url为空").build();
        }

        CloseableHttpClient hc = this.getHttpClient();
        CloseableHttpResponse response = null;
        try {
            HttpPost hpost = new HttpPost(url);
            //默认超时时间
            hpost.setConfig(this.getRequestConfig(socketTime, connTime, connReqTime));

            if (headers != null && !headers.isEmpty()) {
                for (String key : headers.keySet()) {
                    String val = headers.get(key);
                    if (key != null && !"".equals(key) && val != null && !"".equals(val)) {
                        hpost.setHeader(key, val);
                    }
                }
            }

            hpost.setHeader("Content-Type", "application/json; charset=UTF-8");
            StringEntity msg = new StringEntity(json, charset);
            hpost.setEntity(msg);
            response = hc.execute(hpost);

            HttpEntity entity = response.getEntity();
            String data = EntityUtils.toString(entity, charset);
            EntityUtils.consume(entity);
            return HttpResult.builder().status(response.getStatusLine().getStatusCode()).body(data).build();
        } catch (Exception e) {
            e.printStackTrace();
            return HttpResult.builder().status(-1).error(e.getMessage()).build();
        } finally {
            try {
                if(response != null) response.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 发送json请求,返回原始数据字节码
     *
     * @param url           请求地址
     * @param json          请求json数据
     * @param socketTime    超时时间
     * @return
     */
    public HttpResult postJsonResultBytes(String url, String json, int socketTime) {
        if (url == null || "".equals(url)) {
            return HttpResult.builder().status(-1).error("url为空").build();
        }

        CloseableHttpClient hc = this.getHttpClient();
        CloseableHttpResponse response = null;
        try {
            HttpPost hpost = new HttpPost(url);
            //默认超时时间
            hpost.setConfig(this.getRequestConfig(socketTime, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT));

            hpost.setHeader("Content-Type", "application/json; charset=UTF-8");
            StringEntity msg = new StringEntity(json, "UTF-8");
            hpost.setEntity(msg);
            response = hc.execute(hpost);

            HttpEntity entity = response.getEntity();
            byte[] bytes = stream2Bytes(entity.getContent());
            EntityUtils.consume(entity);
            return HttpResult.builder().status(response.getStatusLine().getStatusCode()).bytes(bytes).build();
        } catch (Exception e) {
            e.printStackTrace();
            return HttpResult.builder().status(-1).error(e.getMessage()).build();
        } finally {
            try {
                if(response != null) response.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 发送xml数据
     *
     * @param url   请求地址
     * @param xml   请求xml数据
     * @return
     */
    public HttpResult postXml(String url, String xml) {
        return this.postXml(url, null, xml, CHAR_SET, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT);
    }

    /**
     * 发送xml数据
     *
     * @param url   请求地址
     * @param xml   请求xml数据
     * @return
     */
    public HttpResult postXml(String url, String xml, int socketTime) {
        return this.postXml(url, null, xml, CHAR_SET, socketTime, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT);
    }

    /**
     * 发送xml数据
     *
     * @param url               请求地址
     * @param headers           请求头部
     * @param xml               请求xml数据
     * @param charset           编码
     * @param socketTime        等待响应超时时间
     * @param connTime          建立连接超时时间
     * @param connReqTime       获取连接超时时间
     * @return
     */
    public HttpResult postXml(String url, Map<String, String> headers, String xml, String charset, int socketTime, int connTime, int connReqTime) {
        if (url == null || "".equals(url)) {
            return HttpResult.builder().status(-1).error("url为空").build();
        }

        CloseableHttpClient hc = this.getHttpClient();
        CloseableHttpResponse response = null;
        try {
            HttpPost hpost = new HttpPost(url);
            //默认超时时间
            hpost.setConfig(this.getRequestConfig(socketTime, connTime, connReqTime));

            if (headers != null && !headers.isEmpty()) {
                for (String key : headers.keySet()) {
                    String val = headers.get(key);
                    if (key != null && !"".equals(key) && val != null && !"".equals(val)) {
                        hpost.setHeader(key, val);
                    }
                }
            }
            hpost.setHeader("Content-Type", "application/xml; charset=UTF-8");
            StringEntity msg = new StringEntity(xml, charset);
            hpost.setEntity(msg);
            response = hc.execute(hpost);

            HttpEntity entity = response.getEntity();
            String data = EntityUtils.toString(entity, charset);
            EntityUtils.consume(entity);
            return HttpResult.builder().status(response.getStatusLine().getStatusCode()).body(data).build();
        } catch (Exception e) {
            e.printStackTrace();
            return HttpResult.builder().status(-1).error(e.getMessage()).build();
        } finally {
            try {
                if(response != null) response.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 发送get请求
     * @param url   请求URL地址
     * @return
     */
    public HttpResult doGet(String url) {
        return this.doGet(url, null, null, CHAR_SET, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT);
    }

    /**
     * 发送get请求
     * @param url           请求地址
     * @param socketTime    等待响应超时时间
     * @return
     */
    public HttpResult doGet(String url, int socketTime) {
        return this.doGet(url, null, null, CHAR_SET, socketTime, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT);
    }

    /**
     * 发送get请求
     *
     * @param url    请求URL地址
     * @param params 请求参数
     * @return
     */
    public HttpResult doGet(String url, Map<String, String> params) {
        return this.doGet(url, null, params, CHAR_SET, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT);
    }

    /**
     * 发送get请求
     *
     * @param url     请求URL地址
     * @param headers 请求头部
     * @param params  请求参数
     * @return
     */
    public HttpResult doGet(String url, Map<String, String> headers, Map<String, String> params) {
        return this.doGet(url, headers, params, CHAR_SET, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT);
    }

    /**
     * 发送get请求
     *
     * @param url           请求URL地址
     * @param headers       请求头部
     * @param params        请求参数
     * @param socketTime    等待响应超时时间
     * @return
     */
    public HttpResult doGet(String url, Map<String, String> headers, Map<String, String> params, int socketTime) {
        return this.doGet(url, headers, params, CHAR_SET, socketTime, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT);
    }

    /**
     * 发送GET请求
     *
     * @param url               请求地址
     * @param headers           请求头部
     * @param params            请求参数
     * @param charset           编码
     * @param socketTime        等待响应超时时间
     * @param connTime          建立连接超时时间
     * @param connReqTime       获取连接超时时间
     * @return
     */
    public HttpResult doGet(String url, Map<String, String> headers, Map<String, String> params, String charset, int socketTime, int connTime, int connReqTime) {
        if (url == null || "".equals(url)) {
            return HttpResult.builder().status(-1).error("url为空").build();
        }

        try {
            URIBuilder builder = new URIBuilder(url);
            if (params != null) {
                for (Map.Entry<String, String> entry : params.entrySet()) {
                    builder.setParameter(entry.getKey(), entry.getValue());
                }
            }
            url = builder.build().toString();
        } catch (URISyntaxException e) {
            e.printStackTrace();
            return HttpResult.builder().status(-1).error(e.getMessage()).build();
        }

        CloseableHttpClient hc = this.getHttpClient();
        CloseableHttpResponse response = null;
        try {
            HttpGet hget = new HttpGet(url);
            // 设置超时时间
            hget.setConfig(this.getRequestConfig(socketTime, connTime, connReqTime));
            if (headers != null && !headers.isEmpty()) {
                for (String key : headers.keySet()) {
                    String val = headers.get(key);
                    if (key != null && !"".equals(key) && val != null && !"".equals(val)) {
                        hget.setHeader(key, val);
                    }
                }
            }
            response = hc.execute(hget);

            HttpEntity entity = response.getEntity();
            String data = EntityUtils.toString(entity, charset);
            EntityUtils.consume(entity);
            return HttpResult.builder().status(response.getStatusLine().getStatusCode()).body(data).build();
        } catch (Exception e) {
            e.printStackTrace();
            return HttpResult.builder().status(-1).error(e.getMessage()).build();
        } finally {
            try {
                if(response != null) response.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 下载文件
     * 
     * @param url               请求地址
     * @param headers           请求头部
     * @param params            请求参数
     * @param localPath         本地保存文件路径
     * @param socketTime        数据传输过程中数据包之间间隔的最大时间
     * @param connTime          建立连接超时时间
     * @param connReqTime       从连接池获取连接的超时时间
     * @return
     */
    public HttpResult downloadFile(String url, Map<String, String> headers, Map<String, String> params, String localPath, int socketTime, int connTime, int connReqTime) {
        if (url == null || "".equals(url)) {
            return HttpResult.builder().status(-1).error("url为空").build();
        }

        try {
            URIBuilder builder = new URIBuilder(url);
            if (null != params) {
                for (Map.Entry<String, String> entry : params.entrySet()) {
                    builder.setParameter(entry.getKey(), entry.getValue());
                }
            }
            url = builder.build().toString();
        } catch (URISyntaxException e) {
            e.printStackTrace();
            return HttpResult.builder().status(-1).error("url连接错误").build();
        }

        CloseableHttpClient hc = this.getHttpClient();
        CloseableHttpResponse response = null;
        InputStream is = null;
        ByteArrayOutputStream bos = null;
        FileOutputStream fos = null;
        try {
            HttpGet hget = new HttpGet(url);
            // 超时时间
            hget.setConfig(this.getRequestConfig(socketTime, connTime, connReqTime));
            if (null != headers && !headers.isEmpty()) {
                for (String key : headers.keySet()) {
                    String val = headers.get(key);
                    if (key != null && !"".equals(key) && val != null && !"".equals(val)) {
                        hget.setHeader(key, val);
                    }
                }
            }
            response = hc.execute(hget);

            HttpEntity entity = response.getEntity();
            // 数据长度
            long length = entity.getContentLength();
            // 读取数据输入流,并将数据写入到文件中
            is = entity.getContent();
            bos = new ByteArrayOutputStream();
            byte[] buffer = new byte[4096];
            int read = 0;
            while ((read = is.read(buffer)) > 0) {
                bos.write(buffer, 0, read);
            }
            fos = new FileOutputStream(localPath);
            bos.writeTo(fos);
            bos.flush();
            fos.flush();
            EntityUtils.consume(entity);
            return HttpResult.builder().status(response.getStatusLine().getStatusCode()).body(length + "").build();
        } catch (Exception e) {
            e.printStackTrace();
            return HttpResult.builder().status(-1).error(e.getMessage()).build();
        } finally {
            try {
                if(response != null) response.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if(bos != null) bos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if(fos != null) fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if(is != null) is.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 上传文件
     *
     * @param url           文件接收地址URL
     * @param filePath      本地文件路径
     * @return
     */
    public HttpResult postFile(String url, String filePath) {
        return this.postFile(url, null, null, null, filePath, "UTF-8", 20000, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT);
    }

    /**
     * 上传文件
     *
     * @param url       文件接收地址URL
     * @param fileParam 文件参数名(默认值:file)
     * @param filePath  本地文件路径
     * @return
     */
    public HttpResult postFile(String url, String fileParam, String filePath) {
        return this.postFile(url, null, null, fileParam, filePath, "UTF-8", 20000, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT);
    }

    /**
     * 上传文件
     *
     * @param url               文件接收地址URL
     * @param headers           头信息
     * @param params            附加参数
     * @param fileParam         参数中文件参数名(默认值:file)
     * @param filePath          本地文件路径
     * @param charset           编码
     * @param socketTime        等待响应超时时间
     * @param connTime          连接建立超时时间
     * @param connReqTime       从连接池获取连接的超时时间
     * @return
     */
    public HttpResult postFile(String url, Map<String, String> headers, Map<String, String> params, String fileParam, String filePath, String charset, int socketTime, int connTime, int connReqTime) {
        if (url == null || "".equals(url)) {
            return HttpResult.builder().status(-1).error("url为空").build();
        }

        if (filePath == null || "".equals(filePath)) {
            return HttpResult.builder().status(-1).error("文件路径错误").build();
        }
        File localFile = new File(filePath);
        if (!localFile.exists()) {
            return HttpResult.builder().status(-1).error("未获取到文件").build();
        }
        fileParam = (fileParam == null || "".equals(fileParam)) ? "file" : fileParam;

        CloseableHttpClient hc = this.getHttpClient();
        CloseableHttpResponse response = null;
        try {
            HttpPost hpost = new HttpPost(url);
            // 超时时间
            hpost.setConfig(this.getRequestConfig(socketTime, connTime, connReqTime));

            if (headers != null && !headers.isEmpty()) {
                for (String key : headers.keySet()) {
                    String val = headers.get(key);
                    if (key != null && !"".equals(key) && val != null && !"".equals(val)) {
                        hpost.setHeader(key, val);
                    }
                }
            }
            // hpost.setHeader("Content-Type", "multipart/form-data");

            MultipartEntityBuilder multiBuilder = MultipartEntityBuilder.create();
            // 解决中文文件名乱码
            // multiBuilder.setMode(HttpMultipartMode.RFC6532);
            multiBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
            multiBuilder.setCharset(Charset.forName(charset));

            multiBuilder.addBinaryBody(fileParam, localFile);
            // multipartEntityBuilder.addPart("comment", new StringBody("This is comment", ContentType.TEXT_PLAIN));
            if (params != null && !params.isEmpty()) {
                for (String key : params.keySet()) {
                    String val = params.get(key);
                    if (key != null && val != null) {
                        multiBuilder.addTextBody(key, val);
//                        postEntity.addPart(key, new StringBody(params.get(key).toString(), Charset.forName(charset)));
                    }
                }
            }
            HttpEntity postEntity = multiBuilder.build();
            hpost.setEntity(postEntity);
            response = hc.execute(hpost);

            HttpEntity entity = response.getEntity();
            String data = EntityUtils.toString(entity, charset);
            EntityUtils.consume(entity);
            return HttpResult.builder().status(response.getStatusLine().getStatusCode()).body(data).build();
        } catch (Exception e) {
            e.printStackTrace();
            return HttpResult.builder().status(-1).error(e.getMessage()).build();
        } finally {
            try {
                if(response != null) response.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 上传文件
     *
     * @param url           请求url
     * @param stream        文件流
     * @param filename      原始文件名
     * @param socketTime    等待响应超时时间
     */
    public HttpResult uploadFile(String url, InputStream stream, String filename, int socketTime) {
        if (url == null || "".equals(url)) {
            return HttpResult.builder().status(-1).error("url为空").build();
        }

        CloseableHttpResponse response = null;
        try {
            HttpPost post = new HttpPost(url);
            post.setConfig(this.getRequestConfig(socketTime, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT));
            MultipartEntityBuilder builder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
            builder.addBinaryBody("file", stream, ContentType.MULTIPART_FORM_DATA, filename);
            post.setEntity(builder.build());
            response = getHttpClient().execute(post);
            HttpEntity entity = response.getEntity();
            String data = EntityUtils.toString(entity, StandardCharsets.UTF_8);
            EntityUtils.consume(entity);
            return HttpResult.builder().status(response.getStatusLine().getStatusCode()).body(data).build();
        } catch (Exception e) {
            e.printStackTrace();
            return HttpResult.builder().status(-1).error(e.getMessage()).build();
        } finally {
            try {
                if(response != null) response.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 输入流转字节码
     *
     * @param is        输入流
     * @return
     * @throws IOException
     */
    public static final byte[] stream2Bytes(InputStream is) throws IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] buff = new byte[1024];
        int rc = 0;
        while ((rc = is.read(buff, 0, 1024)) > 0) {
            bos.write(buff, 0, rc);
        }

        return bos.toByteArray();
    }

    /**
     * 获取本机IP
     *
     * @return
     */
    public String getLocalHostIP() {
        String sIP = "";
        InetAddress ip = null;
        try {
            boolean bFindIP = false;
            Enumeration<NetworkInterface> netInterfaces = NetworkInterface.getNetworkInterfaces();
            while (netInterfaces.hasMoreElements()) {
                if (bFindIP) {
                    break;
                }
                NetworkInterface ni = netInterfaces.nextElement();
                Enumeration<InetAddress> ips = ni.getInetAddresses();
                while (ips.hasMoreElements()) {
                    ip = ips.nextElement();
                    if (!ip.isLoopbackAddress() && ip.getHostAddress().matches("(\\d{1,3}\\.){3}\\d{1,3}")
                            && !"127.0.0.1".equals(ip.getHostAddress())) {
                        bFindIP = true;
                        break;
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (ip != null) {
            sIP = ip.getHostAddress();
        }

        return sIP;
    }
}

使用这个工具类非常简单,比如发送一个get请求:

HttpResult result = HttpUtils.getInstance().doGet("https://www.baidu.com");
System.out.println(result.getStatus());
System.out.println(result.getBody());
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值