Java常用HttpClient工具类

HttpClient工具类

记录一个常用的HttpClient工具,还挺好用的,以前经常用,主要再次封装了httpcomponents。提供了一些上传功能,代理请求等不常见的方法!

当然hutool也比较好用,推荐大家使用。

主要功能:

上传视频

提交FormData

提交JSONBody

使用代理,发送请求

Pom文件

        <!-- http客户端 -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.12</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>4.5.12</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
            <version>4.4.13</version>
        </dependency>

工具类

先写一个异常类

public class HttpClientException extends RuntimeException{

    public HttpClientException() {
        super();
    }

    public HttpClientException(String message, Throwable cause) {
        super(message, cause);
    }

    public HttpClientException(String message) {
        super(message);
    }

    public HttpClientException(String message, Object... objects) {
        super(convertMessage(message,objects));
    }

    public HttpClientException(Throwable cause) {
        super(cause);
    }

    public static String convertMessage(String message,Object... objects) {
        if (message.indexOf("{}")>0){
            String s = message.replaceAll("\\{\\}", "%s");
            String format = null;
            try {
                format = String.format(s, objects);
            } catch (Exception e) {
                return message;
            }
            return format;
        }else {
            return message;
        }
    }
}

发出Http请求的工具类


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
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.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 * @Description: <p>通用http调用工具</p>
 */
public class HttpClient {

    private static final Logger log = LoggerFactory.getLogger(HttpClient.class);

    private static final RequestConfig requestConfig;

    private static final RequestConfig uploadConfig;

    static {
        requestConfig = RequestConfig.custom()
                // 客户端和服务器建立连接的timeout
                .setConnectTimeout(1000*60)
                // 指从连接池获取连接的timeout
                .setConnectionRequestTimeout(6000)
                // 客户端从服务器读取数据的timeout
                .setSocketTimeout(1000*60*3)
                .build();
        uploadConfig = RequestConfig.custom()
                // 客户端和服务器建立连接的timeout
                .setConnectTimeout(1000*60*20)
                // 指从连接池获取连接的timeout
                .setConnectionRequestTimeout(6000)
                // 客户端从服务器读取数据的timeout
                .setSocketTimeout(1000*60*20)
                .build();
    }

    /**
     * map转换
     */
    public static Map<String, String> convertMap(JSONObject jsonObject) throws Exception{
        Map<String, Object> innerMap = jsonObject.getInnerMap();
        Map<String, String> map = convertMap(innerMap);
        return map;
    }

    /**
     * map转换
     */
    public static Map<String, String> convertMap(Map<String, Object> objectMap) throws Exception{
        Map<String, String> map = new HashMap<>();
        for(Map.Entry<String, Object> entries : objectMap.entrySet()){
            map.put(entries.getKey(),null == entries.getValue() ? null : String.valueOf(entries.getValue()));
        }
        return map;
    }

    /**
     * 发送get请求,接收json响应数据
     * GET
     * @param url 访问地址,无query参数
     * @param param query参数
     * @return
     */
    public static JSONObject doGet(String url, Map<String, String> param) throws HttpClientException{

        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();

        String resultString = "";
        CloseableHttpResponse response = null;
        try {
            // 创建uri
            URIBuilder builder = new URIBuilder(url);
            if (param != null) {
                for (String key : param.keySet()) {
                    builder.addParameter(key, param.get(key));
                }
            }
            URI uri = builder.build();
            log.debug("-->>Http GET请求地址:"+url);
            if(null != param){
                log.debug("-->>Http 请求参数:"+param.toString());
            }

            // 创建http GET请求
            HttpGet httpGet = new HttpGet(uri);
            httpGet.setConfig(requestConfig);

            // 执行请求
            response = httpClient.execute(httpGet);
            // 判断返回状态是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
                log.debug("<<--Http 响应内容:"+resultString);
            }else{
                log.error("<<--Http 响应状态码:"+response.getStatusLine().getStatusCode());
                throw new HttpClientException("请求失败 状态码:{}",response.getStatusLine().getStatusCode());
            }

        } catch (IOException | URISyntaxException e) {
            log.error("Http 发送请求异常 url:{}",url,e);
            throw new HttpClientException("发送请求失败 url:{}",url);
        } finally {
            try {
                if (response != null) {
                    response.close();
                }
                httpClient.close();
            } catch (IOException e) {
                log.error("Http 关闭流异常",e);
            }
        }
        return JSONObject.parseObject(resultString);
    }

    /**
     * 发送post请求,上传byte
     * POST binary
     * @param url 请求地址,不拼接
     * @return
     */
    public static JSONObject doPostBinaryBody(String url,byte[] bytes,String fileName) throws HttpClientException{
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";
        try {
            // 创建Http Post请求
            log.debug("-->>Http POST请求地址:"+url);

            HttpPost httpPost = new HttpPost(url);
            httpPost.setConfig(uploadConfig);
            // 创建参数列表

            MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
            // TODO:这个video自己填,因为这个方法非常少用,是我用来上传视频的,所以这里写死了
            multipartEntityBuilder.addBinaryBody("video", bytes, ContentType.MULTIPART_FORM_DATA,fileName );

            httpPost.setEntity(multipartEntityBuilder.build());
            // 执行http请求
            response = httpClient.execute(httpPost);
            // 判断返回状态是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
                log.debug("<<--Http 响应内容:"+resultString);
            }else{
                log.error("<<--Http 响应状态码:"+response.getStatusLine().getStatusCode());
                throw new HttpClientException("请求失败 状态码:{}",response.getStatusLine().getStatusCode());
            }
        } catch (Exception e) {
            log.error("Http 发送请求异常 url:{}",url,e);
            throw new HttpClientException("发送请求失败 url:{}",url);
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                log.error("Http 关闭流异常",e);
            }
        }
        return JSONObject.parseObject(resultString);
    }

    /**
     * 发送post请求,form-data数据传输
     * POST multipart/form-data
     * @param url 请求地址
     * @return 返回json数据
     */
    public static JSONObject doPostFormData(String url,Map<String, String> formData) throws HttpClientException{
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";
        try {
            // 创建Http Post请求
            log.debug("-->>Http POST请求地址:"+url);

            HttpPost httpPost = new HttpPost(url);
            httpPost.setConfig(requestConfig);
            // 创建参数列表
//            httpPost.setHeader("Content-Type", "multipart/form-data;charset=utf-8"); // 报错
            MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
            if (formData != null) {
                log.debug("-->>Http POST form-data内容:"+ JSON.toJSONString(formData));
                for (String key : formData.keySet()) {
                    multipartEntityBuilder.addTextBody(key,formData.get(key), ContentType.MULTIPART_FORM_DATA);
                }
            }

            httpPost.setEntity(multipartEntityBuilder.build());
            // 执行http请求
            response = httpClient.execute(httpPost);
            // 判断返回状态是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
                log.debug("<<--Http 响应内容:"+resultString);
            }else{
                log.error("<<--Http 响应状态码:"+response.getStatusLine().getStatusCode());
                throw new HttpClientException("请求失败 状态码:{}",response.getStatusLine().getStatusCode());
            }
        } catch (Exception e) {
            log.error("Http 发送请求异常",e);
            throw new HttpClientException("发送请求失败 url:{}",url);
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                log.error("Http 关闭流异常",e);
            }
        }
        return JSONObject.parseObject(resultString);
    }
    
    /**
     * 发送post请求,接收json响应数据
     * POST application/x-www-form-urlencoded
     * @param url 请求地址,不拼接
     * @param param 表单query参数
     * @return
     */
    public static JSONObject doPost(String url, Map<String, String> param) throws HttpClientException{
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";
        try {
            // 创建Http Post请求
            log.debug("-->>Http POST请求地址:"+url);
            if (null != param){
                log.debug("-->>Http 请求参数:"+param.toString());
            }

            HttpPost httpPost = new HttpPost(url);
            httpPost.setConfig(requestConfig);
            // 创建参数列表
            if (param != null) {
                List<NameValuePair> paramList = new ArrayList<>();
                for (String key : param.keySet()) {
                    paramList.add(new BasicNameValuePair(key, param.get(key)));
                }
                // 模拟表单
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
                httpPost.setEntity(entity);
            }
            // 执行http请求
            response = httpClient.execute(httpPost);
            // 判断返回状态是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
                log.debug("<<--Http 响应内容:"+resultString);
            }else{
                log.error("<<--Http 响应状态码:"+response.getStatusLine().getStatusCode());
                throw new HttpClientException("请求失败 状态码:{}",response.getStatusLine().getStatusCode());
            }
        } catch (Exception e) {
            log.error("Http 发送请求异常 url:{}",url,e);
            throw new HttpClientException("发送请求失败 url:{}",url);
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                log.error("Http 关闭流异常",e);
            }
        }
        return JSONObject.parseObject(resultString);
    }

    /**
     * 发送post请求,接收json响应数据
     *  POST application/json
     * @param url 请求地址
     * @param json json入参
     * @return
     */
    public static JSONObject doPostJson(String url, String json) throws HttpClientException {
        if(StringUtils.isBlank(json)){
            log.error("-->>Http POST发送json数据,json不能为空,url:"+url);
            return null;
        }
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";
        try {
            log.debug("-->>Http POST请求地址:"+url);
            log.debug("-->>Http 请求参数:"+json);
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);
            httpPost.setConfig(requestConfig);
            // 创建请求内容
            StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
            httpPost.setEntity(entity);
            // 执行http请求
            response = httpClient.execute(httpPost);
            // 判断返回状态是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
                log.debug("<<--Http 响应内容:"+resultString);
            }else{
                log.error("<<--Http 响应状态码:"+response.getStatusLine().getStatusCode());
                throw new HttpClientException("请求失败 状态码:{}",response.getStatusLine().getStatusCode());
            }
        } catch (Exception e) {
            log.error("Http 发送请求异常 url:{}",url,e);
            throw new HttpClientException("发送请求失败 url:{}",url);
        } finally {
            try {
                if (response != null) {
                    response.close();
                }
                httpClient.close();
            } catch (IOException e) {
                log.error("Http 关闭流异常",e);
            }
        }
        return JSONObject.parseObject(resultString);
    }


     /**
     * 发送get请求,接收json响应数据 [使用代理]
     *
     * @param url 访问地址,不拼接
     * @param params query参数
     * @param headers 请求头
     * @param proxyHost 代理服务器地址
     * @param proxyPort 代理服务器端口
     * @param proxyUser 认证用户名
     * @param proxyPassword 认证密码
     * @return
     * @throws HttpClientException
     */
    public static JSONObject doGetProxy(String url,
                                        Map<String, String > params,
                                        Map<String, String > headers,
                                        String proxyHost,Integer proxyPort,
                                        String proxyUser , String proxyPassword) throws HttpClientException{
        String resultString = "";
        CloseableHttpResponse response = null;
        CloseableHttpClient httpClient = null;
        try {
            // 设置代理HttpHost
            HttpHost proxy = new HttpHost(proxyHost, proxyPort);

            // 设置代理认证
            CredentialsProvider provider = new BasicCredentialsProvider();
            provider.setCredentials(new AuthScope(proxy), new UsernamePasswordCredentials(proxyUser, proxyPassword));

            httpClient = HttpClients.custom().setDefaultCredentialsProvider(provider).build();

            // 构建URI
            URIBuilder builder = new URIBuilder(url);
            if (params != null) {
                for (String key : params.keySet()) {
                    builder.addParameter(key, params.get(key));
                }
            }
            URI uri = builder.build();

            // 装配发送Get请求
            HttpGet httpGet = new HttpGet(uri);
            log.info("-->> ProxyHttp 请求内容:"+uri.toString());

            // 请求设置时间
            RequestConfig requestConfig = RequestConfig.custom()
                    .setProxy(proxy)
                    .setConnectTimeout(10000)
                    .setSocketTimeout(10000)
                    .setConnectionRequestTimeout(3000)
                    .build();
            httpGet.setConfig(requestConfig);

            // 装配请求头
            if (null != headers){
                for(Map.Entry<String, String> entry : headers.entrySet()) {
                    httpGet.setHeader(entry.getKey(), entry.getValue());
                }
            }

            // 执行请求
            response = httpClient.execute(httpGet);

            // 判断返回状态是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
                log.info("<<--ProxyHttp 响应内容:"+resultString);
            }else{
                log.error("<<--ProxyHttp 响应状态码:"+response.getStatusLine().getStatusCode());
                throw new HttpClientException("请求失败");
            }
        } catch (IOException | URISyntaxException e) {
            log.error("ProxyHttp 发送请求异常",e);
            throw new HttpClientException("ProxyHttp 发送请求失败 url:{}",url);
        }  finally {
            try {
                if (response != null) {
                    response.close();
                }
                httpClient.close();
            } catch (IOException e) {
                log.error("ProxyHttp 关闭流异常",e);
            }
        }
        return JSONObject.parseObject(resultString);
    }
}

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

推荐阅读更多精彩内容