Apache的HttpClient创建CloseableHttpClient的例子

news/2024/7/3 19:41:40

Apache的HttpClient可以被用于从客户端发送HTTP请求到服务器端,

使用Apache的HttpClient发送GET和POST请求的步骤如下:
1. 使用帮助类HttpClients创建CloseableHttpClient对象.
2. 基于要发送的HTTP请求类型创建HttpGet或者HttpPost实例.
3. 使用addHeader方法添加请求头部,诸如User-Agent, Accept-Encoding等参数.
4. 对于POST请求,创建NameValuePair列表,并添加所有的表单参数.然后把它填充进HttpPost实体.
5. 通过执行此HttpGet或者HttpPost请求获取CloseableHttpResponse实例
6. 从此CloseableHttpResponse实例中获取状态码,错误信息,以及响应页面等等.
7. 最后关闭HttpClient资源.

    public String doPost(String url, String params) {
        String result = "";
        CloseableHttpClient httpclient = null;
        CloseableHttpResponse response = null;
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        HttpSession session = request.getSession();
        if (session != null) {
            httpclient = (CloseableHttpClient) session.getAttribute("httpclient");
        }
        if (httpclient == null) {
            httpclient = HttpClients.createDefault();
        }
        try {
            HttpPost httppost = new HttpPost(url);
            httppost.setHeader("accept", "*/*");
            httppost.setHeader("connection", "Keep-Alive");
            httppost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36");

            if (params != null && !"".equals(params)) {
                MultipartEntityBuilder reqEntity = MultipartEntityBuilder.create();
                reqEntity.setCharset(Charset.forName("utf-8"));
                String[] nameAndValue = params.split("&");
                for (String s : nameAndValue) {
                    String[] keyAndvalue = s.split("=",2);
                    //String[] keyAndvalue = s.split("=");
                    StringBody value = new StringBody("", ContentType.TEXT_PLAIN);
                    if(keyAndvalue.length == 2) {
                        value = new StringBody(keyAndvalue[1], Charset.forName("utf-8"));
                        //value = new StringBody(keyAndvalue[1],  ContentType.TEXT_PLAIN);
                    }
                    reqEntity.addPart(keyAndvalue[0], value);
                }
                HttpEntity httpEntity = reqEntity.build();
                httppost.setEntity(httpEntity);
            }
            response = httpclient.execute(httppost);
            HttpEntity resEntity = response.getEntity();
            if(resEntity != null) {
                result = EntityUtils.toString(resEntity, "utf-8");
            }
            EntityUtils.consume(resEntity);
            //if (url.endsWith("center/login") || url.endsWith("#forgetPswd") || url.endsWith("#register")) {
                session.setAttribute("httpclient", httpclient);
            //}

                //2017-08-24 解决由session过期导致请求返回会员未登录的问题
                if(StringUtils.isNotBlank(result)){
                    boolean isJson = Common.isJson(result);
                    //有些请求不是json格式,比如医院动态
                    if(isJson){
                        JSONObject js = JSONObject.fromObject(result);
                        //有些result没有返回code
                        if(js.has("code")){
                            if(ErrorCode.LS_ILLEGAL_LOGIN.equals(js.getString("code"))){
                                log.info("【本次请求返回会员未登录】"+js.toString());
                                //将请求信息放入缓存
                                RCacheEnTity rCacheEnTity = new RCacheEnTity(url,params,new Date());
                                CachePool.getInstance().putCacheItem("RC", rCacheEnTity);
                                String openId = (String) request.getSession().getAttribute("openId");
                                log.info("【重新登陆的openID】"+openId);
                                //进行重新登陆
                                String cxdl = doPost(WechatContext.getInstance().getServerUrl() + "center/wechatLogin", "username=" + openId);
                                //将上次的请求信息取出
                                CacheItem cacheItem = (CacheItem) CachePool.getInstance().getCacheItem("RC");
                                RCacheEnTity rCacheEnTity2 = (RCacheEnTity) cacheItem.getEntity();
                                log.info("【重新请求的URL】"+rCacheEnTity2.getUrl());
                                //重新发送上次的请求
                                String cxqq = doPost(rCacheEnTity2.getUrl(),rCacheEnTity2.getParams());
                                JSONObject cx = JSONObject.fromObject(cxqq);
                                //请求成功之后将缓存中的上次的请求信息去除
                                if(ErrorCode.LS_SUCCESS.equals(cx.getString("code"))){
                                    //如果请求成功则去除缓存
                                    CachePool.getInstance().removeCacheItem("RC");
                                    result=cxqq;
                                }else{
                                    CachePool.getInstance().removeCacheItem("RC");
                                }
                            }
                        }
                    }
                }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (response != null) {
                    response.close();
                }
                // httpclient.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }

        return result;
    }

http://www.niftyadmin.cn/n/647550.html

相关文章

Java synchronized关键字用法(清晰易懂)

本篇随笔主要介绍 java 中 synchronized 关键字常用法,主要有以下四个方面: 1、实例方法同步 2、静态方法同步 3、实例方法中同步块 4、静态方法中同步块 我觉得在学习synchronized关键字之前,我们首先需要知道以下一点:Java 中每…

StringUtils.isNumeric使用

网上查"java 判断字符串为数字"阅资料,大部分资料都在讲字符串转为整数的情况,很少资料提及关于负数和小数的情况,最终决定采用StringUtils.isNumberic这个方法差别, 在测试导出时发现有报错,用debug模块一…

Terminator 安装与使用

2019独角兽企业重金招聘Python工程师标准>>> 对Linux系统进行管理时,我们经常需要通过终端窗口输入各种操作命令。在GNOME桌面环境下,GNOME终端(gnome-terminal) 是我们经常使用的终端程序,每次运行该程序都将打开一个单独的终端窗…

在javaweb中将excel表格导入存放数据库

在jsp页面 <html> <body> <head> <script type"text/javascript"> function fileChange(input){var fileName input.value;if(fileName.length > 1 && fileName ) { var ldot fileName.lastIndexOf(".");var …

Android获取View对应的Bitmap

我的应用里面有一个需求&#xff0c;将一个画面分享出去&#xff0c;这个画面底层是一个View&#xff0c;所以首先要把这个View转换成Bitmap&#xff0c;然后在分享这个bitmap即可。话不多说&#xff0c;直接上代码。 有个地方需要注意一下&#xff1a;就是//Draw background的…

Java进阶之设计模式

什么是设计模式 答&#xff1a;简单的说&#xff0c;设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计的 经验的总结。使用设计模式是为了可重用代码&#xff0c;让代码更容易被他人理解&#xff0c;保证代码可靠性。 通常来说设计模式分为三大类&#xff1a; …

用Python实现不同数据源的对象匹配【思考】

关于之前的利用python实现不同数据源的数据匹配的实验的一些思考&#xff1a; 在开始匹配之前一定要对于两个数据源中的记录进行分析&#xff0c;结合实际的应用场景判断合适的匹配字段&#xff1b;开始匹配之前可以进行一些简单的判断&#xff0c;看看所得到的数据的纯净度如何…

float double BigDecimal 详解

首先给看一个代码段 package com.main;public class Test1 {public static void main(String[] args){double b10.060.01;float b2(float) (0.060.01);System.out.println(0.060.01);System.out.println(1.0-0.42);System.out.println(4.015*100);System.out.println(303.1/10…