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

智能推荐

统计学习导论(七)非线性模型——学习笔记_鸭鸭鸭鸭鸭鸭的博客-程序员宅基地

1. 多项式回归 Polynomial Regression对线性模型的推广:以预测变量的幂作为新的预测变量来代替原始变量。将标准线性模型yi=β0+β1xi+ϵiy_{i}=\beta_{0}+\beta_{1} x_{i}+\epsilon_{i}yi​=β0​+β1​xi​+ϵi​换成一个多项式函数yi=β0+β1xi+β2xi2+β3xi3+…+βdxid+ϵiy_{i}=\beta_{0}+\beta_{1} x_{i}+\beta_{2} x_{i}^{2}+\beta_{3} x_{i}

服务监控_李多肉同学的博客-程序员宅基地_服务监控

微服务由于服务数量众多,所以出故障的概率很大,这种时候不能单纯地依靠人肉运维。早期的 Spring Cloud 中,服务监控主要使用 Hystrix Dashboad ,集群数据库监控使用 Turbine。在 Greenwich 版本中,官方的建议监控工具使用 Micrometer。Micrometer:提供了度量指标,例如 timers、counters一揽子开箱即用的解决方案,如缓存、类加载器、垃圾收集等等。新建一个 Spring Boot 项目, 添加 Actuator 依赖。项目创建

Timer控件使用(System.Timers.Timer)_NCTU_to_prove_safety的博客-程序员宅基地

System.Timers.Timer t =  new System.Timers.Timer(10000);  //实例化Timer类,设置间隔时间为10000毫秒;   t.Elapsed +=  new System.Timers.ElapsedEventHandler(theout);  //到达时间的时候执行事件; t.AutoReset = true;

linux c底层安全,Linux-C-高级-第5章-SELinux安全系统基础_简 Ai的博客-程序员宅基地

目录(持续更新)第5章 SELinux安全系统基础第一节SELinuxSELinux 安全增强 NSA针对计算机结构安全开发的全新安全策略机制,允许管理员更灵活定义安全策略SELinux是一个内核安全机制 2.6内核后集成在内核里主流Linux发行版都有集成SELinux CentOS/RHEL默认开启内核机制,一切内核级修改都需要重启SELinux基本概念所有安全机制是对两样东西做出限制进程...

matplotlib | 气温变化可视化_加油strive的博客-程序员宅基地_气温可视化

目录日气温变化可视化(基础操作)日气温变化可视化(高级操作subplots)常见图形绘制日气温变化可视化(基础操作)导入包import matplotlib.pyplot as pltimport randompycharm中图片显示中文plt.rcParams['font.sans-serif'] = ['SimHei']1.创建画布plt.figure(figsize=(20,8),dpi=64)2.数据准备 (多折线图)x = [i for i in rang

PM做事流程_WanghuiRs的博客-程序员宅基地_pm流程

1.产品经理的主要工作职责作为一名新进产品经理,甚至一名资深PM,你可能都或多或少对这个职位产生某种迷惑。到底什么是产品经理?这个职位的主要职责是什么?在IT产业的不同领域,甚至在同一领域的不同公司,这个职位的定义似乎都有不同。虽然在不同的公司,产品经理的角色和职责互有差异,但是有一些关键职责是任何一个产品经理都应承担的。可以将其归纳为如下六个方面:1.1市场调研市场调研是指研究市

随便推点

重定向的实现_不爱吃糖的程序媛的博客-程序员宅基地_重定向怎么实现

1.重定向是什么?重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)。举个例子:????在小程序中,比如A - ->C页面,它需要先从 A – >B – >C,重定向就先当于B – >C这个过程。2.重定向的意义我们都知道进入主页面之前要走“登录”这一步操作,登录的目的就是为了获取个人openID唯一标识,限制一些没有身份的人登录和操作主页面,而这个登录页面是进入主页面操作的一道关卡。可偏

【转载】Eclipse Class Decompiler——Java反编译插件_天涯在身边的博客-程序员宅基地

参见:jd-eclipse 的安装和使用(最新版的)  https://blog.csdn.net/u011242657/article/details/40324281---------------------------------------------------------------------------------------最新实验:Eclipse Version: ...

WEB缓存策略_shasharoman的博客-程序员宅基地

WEB缓存策略在计算机领域,缓存是一个常见的词汇,其核心目的是为了追求更快的速度,提高系统的整体性能,本文总结一下自己对WEB缓存策略理解。WEB缓存策略,目的是通过让client与server之间尽可能少的传输重复数据,节省时间和带宽成本。主要包含三个要素: 缓存存储策略,决定是否存储缓存到本地,涉及HTTP头部:Cache-Control: (public | priva...

心中有“树”:数据结构之树详解_一只划水的Doge的博客-程序员宅基地

文章目录前言(一)树的基础定义与表示1 树的定义2 树的图示3 树的逻辑结构表示法(二)二叉树1 二叉树定义2 二叉树示意图3 程序实现(1)节点定义(2)二叉树的先序遍历(3)二叉树非递归先序遍历(4)二叉树层序遍历(5)计算二叉树的深度4 二叉树算法设计题目1 查找元素为X的节点2 判断二叉树是否为完全二叉树(三)树1 树的存储结构2 存储结构图示3 树的先序遍历4 求树的深度(四)总结(五)参考文献前言树型结构是一类重要的非线性数据结构。其中以树和二叉树最为常用。树状结构在客观世界中广泛存在,如人

唐巧iOS博客好文列表_zhangyanjinlichang的博客-程序员宅基地

http://blog.csdn.net/feixiang_song/article/details/42142105

推荐文章

热门文章

相关标签