HttpClient封装成常规请求方法 get post 支持key-value和json 格式传参_宇霖的博客-程序员宅基地

技术标签: Java  Https  http  Http  Json  https  httpclient  

/**
 * @Description Http|Https 请求工具类
 * @Author blake
 * @Date 2018/12/12 下午4:33
 * @Version 1.0
 */
public class HttpUtils {

    private static PoolingHttpClientConnectionManager connMgr;
    private static RequestConfig requestConfig;
    private static final int MAX_TIMEOUT = 7000;

    static {

        // 设置连接池
        connMgr = new PoolingHttpClientConnectionManager();

        // 设置连接池大小
        connMgr.setMaxTotal(100);
        connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal());

        RequestConfig.Builder configBuilder = RequestConfig.custom();

        // 设置连接超时
        configBuilder.setConnectTimeout(MAX_TIMEOUT);

        // 设置读取超时
        configBuilder.setSocketTimeout(MAX_TIMEOUT);

        // 设置从连接池获取连接实例的超时
        configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT);

        // 在提交请求之前 测试连接是否可用
        connMgr.setValidateAfterInactivity(5000);
        // configBuilder.setStaleConnectionCheckEnabled(true);

        requestConfig = configBuilder.build();
    }

    /**
     * 发送 GET 请求(HTTP),不带参数
     *
     * @param url
     * @return
     */
    public static String doGet(String url) {
        return doGet(url, new HashMap<>());
    }

    /**
     * 发送 GET 请求(HTTP),传入参数为 Key-Value 形式
     *
     * @param url
     * @param params
     * @return
     */
    public static String doGet(String url, Map<String, Object> params) {
        String apiUrl = url;
        StringBuffer param = new StringBuffer();
        int i = 0;
        for (String key : params.keySet()) {
            if (i == 0)
                param.append("?");
            else
                param.append("&");
            param.append(key).append("=").append(params.get(key));
            i++;
        }
        apiUrl += param;
        String result = null;
        HttpClient httpclient = HttpClientBuilder.create().build();
        try {
            HttpGet httpPost = new HttpGet(apiUrl);
            HttpResponse response = httpclient.execute(httpPost);
            int statusCode = response.getStatusLine().getStatusCode();

            System.out.println("执行状态码 : " + statusCode);

            HttpEntity entity = response.getEntity();
            if (entity != null) {
                InputStream inStream = entity.getContent();
                result = IOUtils.toString(inStream, "UTF-8");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 发送 POST 请求(HTTP),不带参数
     *
     * @param apiUrl
     * @return
     */
    public static String doPost(String apiUrl) {
        return doPost(apiUrl, new HashMap<>());
    }

    /**
     * 发送 POST 请求(HTTP),参数为 Key-Value 形式
     *
     * @param apiUrl API接口URL
     * @param params 参数map
     * @return
     */
    public static String doPost(String apiUrl, Map<String, Object> params) {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        String httpStr = null;
        HttpPost httpPost = new HttpPost(apiUrl);
        CloseableHttpResponse response = null;

        try {
            httpPost.setConfig(requestConfig);
            List<NameValuePair> pairList = new ArrayList<>(params.size());
            for (Map.Entry<String, Object> entry : params.entrySet()) {
                NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry
                        .getValue().toString());
                pairList.add(pair);
            }
            httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("UTF-8")));
            response = httpClient.execute(httpPost);
            System.out.println(response.toString());
            HttpEntity entity = response.getEntity();
            httpStr = EntityUtils.toString(entity, "UTF-8");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (response != null) {
                try {
                    EntityUtils.consume(response.getEntity());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return httpStr;
    }

    /**
     * 发送 POST 请求(HTTP),参数为JSON形式
     *
     * @param apiUrl
     * @param json   json对象
     * @return
     */
    public static String doPost(String apiUrl, Object json) {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        String httpStr = null;
        HttpPost httpPost = new HttpPost(apiUrl);
        CloseableHttpResponse response = null;

        try {
            httpPost.setConfig(requestConfig);
            StringEntity stringEntity = new StringEntity(json.toString(), "UTF-8");
            stringEntity.setContentEncoding("UTF-8");
            stringEntity.setContentType("application/json");
            httpPost.setEntity(stringEntity);
            response = httpClient.execute(httpPost);
            HttpEntity entity = response.getEntity();
            System.out.println(response.getStatusLine().getStatusCode());
            httpStr = EntityUtils.toString(entity, "UTF-8");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (response != null) {
                try {
                    EntityUtils.consume(response.getEntity());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return httpStr;
    }

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wub116/article/details/86554744

智能推荐

shell批量clone仓库代码和批量拉取代码_clone dev 代码-程序员宅基地

批量clone仓库代码#!/bin/bashcode_addr=('[email protected]:project/project1.git''[email protected]:project/project1.git''[email protected]:project/project1.git')website_dir=websiteclone_code(){ #判断文件夹是否存在 if [ -d $website_dir ];then echo "文件夹存在" cd $websit_clone dev 代码

zk学习之四字命令_zk四字命令-程序员宅基地

四字命令可以在linux的环境下查看zk的一些相关的信息,使用之前需要安装nc命令:yum install nc四字命令语法:echo:[command] | nc [ip] [port]常用command:(1)stat:查看当前zk的状态信息,,以及mode(表示单机或集群)模式(2)ruok:查看当前zk服务器是否启动状态,若启动,回复imok(3)dump:..._zk四字命令

迪士尼CEO:元宇宙是迪士尼的未来,迪士尼会成为元宇宙“最快乐的地方”_巴比特资讯的博客-程序员宅基地

本周一,沃尔特·迪士尼(Disney)公司CEO Bob Chapek在波士顿举行的活动中表示,虚拟现实“元宇宙”是迪士尼的未来。尽管元宇宙尚未创建出来,但这位迪士尼CEO已将虚拟现实世界..._迪士尼ceo

JVM运行参数 系统参数 -xx参数 -x参数 你学废了吗?_-xx 配置+号是什么-程序员宅基地

前言首先聊一下什么是JVM, 我们为什么要去学习JVMJVM Java虚拟机它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的,引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运..._-xx 配置+号是什么

hive锁-程序员宅基地

hive lock报错 FAILED: Error in acquiring locks: Locks on the underlying objects cannot be acquired. retry after some time 解决办法:关闭并发,set hive.support.concurrency=false;hive锁介绍: hive存在两种锁,共享锁Shar

9.17之前的安卓笔试题总结——持续更新-程序员宅基地

从周六开始,面试、笔试、宣讲会连轴转,昨天收到群面的fail通知之后,下午也不想去广工现场跟一群汉子手撕代码了,选择了爬床睡觉,过了一天的安逸日子,终于勤奋起来把之前的笔试盲点总结一下,虎牙面试的稍后再整理。希望IT行业对女生少点偏见吧————————————————————————正文分割线———————————————————————————1、TCP采用心跳报文保持连接 √...

随便推点

2.2 Mybatis——注解开发-程序员宅基地

1.注解开发与xml开发区别: (1)注解开发不需要在resources下创建实体类映射文件(file)UserMapper.xml。 (2)注解开发的sql语句写在 dao层接口的方法上面xml开发sql语句写在dao层在resources层对应的.xml映射文件中。 (3)注解开发mybatis-config.xml的内的映射指向dao层接口的全限定路径,xml开发mybatis-config.xml的内的映射指向dao...

Android Manifest.xml 结构详解-程序员宅基地

关于AndroidManifest.xmlAndroidManifest.xml 是每个android程序中必须的文件。它位于整个项目的根目录,描述了package中暴露的组件(activities,services, 等等),他们各自的实现类,各种能被处理的数据和启动位置。 除了能声明程序中的Activities, ContentProviders, Services,和Intent

区分 程序(Program) VS 进程(Process)_vs process_我要敲代码6400的博客-程序员宅基地

1.什么是程序?一套做数据处理的步骤。程序 = 指令+ 数据。是一套静态的步骤。(比如说菜谱)程序是静态的,一般表现为一个或一组文件2.什么是进程?1.站在用户角度的视角()英文本意就是:过程进程是程序的一次执行过程——按照菜谱的一次做菜的过程,进程是动态的。一个程序,可以进行多次执行(表现为多个进程);甚至可以“同时”执行(多个进程同时存在)进程是程序在“运行阶段”的视角主题2.站在 OS(操作系统)实现的角度看什么是进程()进程..._vs process

数字图像处理 张量分解的概念、发展及其应用_张量分解的应用-程序员宅基地

介绍了张量PCA及其变体,包括鲁棒张量PCA(R-TPCA)、张量低秩表示(TLRR)和异常稳健张量PCA(OR-TPCA),用于处理三种数据,即(i)高斯噪声张量数据、(ii)稀疏破坏张量数据和(iii)异常破坏张量数据。例如,对于具有稀疏破坏的低秩张量数据,R-TPCA和TLRR可以在温和的条件下准确地恢复干净的数据,而TLRR可以准确地检索它们的真实张量子空间,从而准确地对它们进行聚类。1927年,希区柯克提出了张量的多元形式的概念,即将张量表示为有限数量的秩一张量的和;张量是一个多维数组。_张量分解的应用

hdu 火星A+B 1230-程序员宅基地

火星A+BTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12205 Accepted Submission(s): 4115Problem Description读入两个不超过25位的火星正整数A和B

Android OKhttp 上传文件袋参数-程序员宅基地

public void uploadImage(String interfaceUrl,String filePath,String idCardNo) { Logger.d(“interfaceUrl:”+interfaceUrl); OkHttpClient mOkHttpClient = new OkHttpClient(); File ...