4.5.2HttpClientUtil【上海时时乐走势图官网】

       come on baby

招待指教~
参谋资料
起个名忒难-httpclient 4.5.2 学习小说(1)
起个名忒难-httpclient 4.5.2 学习小说(2)
起个名忒难httpclient 4.5.2 学习小说(3)
运用HttpClient达成公文的上传下载 - lijin1185374093 - 搜狐
blog.csdn.net/comven2/article/details/52180620

在微信小程序支付中,大家得以依附不一样的事务场景,开拓区别的事情使用,能够依据自身域名服务接口,也足以依靠第三方的域名接口进行拍卖(假设被剥夺除了那些之外),本篇小说介绍使用小程序来贯彻笔者博客(

  那篇随笔笔者策画搞搞ajax的包装,那几个包裹吧,笔者筹算直接上海教室了,因为间接打在小说上面笔者要好都是为太乱了,没心境看

/**
 * http工具类
 * @author dubl
 * @version 1.0.0 , 2016年12月8日 下午2:28:48
 */
public class HttpClientUtil {

    /** 日志 */
    private static Logger logger = LogManager.getLogger(HttpClientUtil.class.getName());

    /** 请求超时设置*/
    private static RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(15000).setConnectionRequestTimeout(7500).setSocketTimeout(15000).build();

    /** 编码设置*/
    private static final String encoding = "UTF-8";

    /** 请求方式枚举*/
    public static enum httpRequestMethod {
        GET, POST;
    };

    /**
     * 创建HTTPS连接
     * 
     * @return 自动关闭的https连接
     * @throws Exception
     * @author dubl
     */
    public static CloseableHttpClient getHttpsClient() throws Exception {
        CloseableHttpClient httpClient = null;
        // 重写ssl证书校验 do something or do nothing
        TrustManager trustManager = new X509TrustManager() {

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }

            @Override
            public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {

            }

            @Override
            public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {

            }
        };
        try {
            // 开启SSL
            SSLContext sslContext = SSLContext.getInstance("TLS");
            // 初始化ssl校验
            sslContext.init(null, new TrustManager[] { trustManager }, null);
            // 注册ssl链接工厂
            SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext,
                    NoopHostnameVerifier.INSTANCE);
            // 请求配置
            RequestConfig requestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT)
                    .setExpectContinueEnabled(true)
                    .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST))
                    .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC)).build();
            // 链接配置
            Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
                    .register("http", PlainConnectionSocketFactory.INSTANCE).register("https", socketFactory).build();
            // 创建ConnectionManager,添加Connection配置信息
            PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(
                    socketFactoryRegistry);
            // 创建连接
            httpClient = HttpClients.custom().setConnectionManager(connectionManager)
                    .setDefaultRequestConfig(requestConfig).build();
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("创建https连接出错。"   e.getMessage());
        }
        return httpClient;
    }

    /**
     * 发送http请求
     * 
     * @param url 请求地址
     * @param method 请求方式
     * @param params 参数 K-V模式
     * @return 返回结果字符串
     * @throws Exception
     * @author dubl
     */
    public static String sendHttpRequest(String url, httpRequestMethod method, Map<String, String> params) throws Exception {
        CloseableHttpResponse response = null;
        String result = null;
        logger.info(method.name()   ":"   url   "--"   params);
        if (httpRequestMethod.GET == method) {
            response = sendGetRequest(url, params);
        } else if (httpRequestMethod.POST == method) {
            response = sendPostRequest(url, params);
        }
        HttpEntity entity = response.getEntity();
        result = EntityUtils.toString(entity, encoding);
        int statusCode = response.getStatusLine().getStatusCode();
        response.close();
        if (statusCode == HttpStatus.SC_OK) {
            EntityUtils.consume(entity);
            logger.info("HTTP-RESPONSE"   result);
        } else {
            throw new Exception("发送HTTP请求:"   url   "出现异常,返回内容为:"   result);
        }
        return result;
    }

    /**
     * http发送文件
     * 
     * @param url
     *            请求路径
     * @param params
     *            参数
     * @param files
     *            文件集合
     * @return
     * @throws Exception
     * @author dubl
     */
    public static String sendHttpRequestFile(String url, Map<String, String> params, File[] files) throws Exception {
        CloseableHttpClient httpClient = null;
        CloseableHttpResponse response = null;
        String result = null;
        try {
            Charset charset = CharsetUtils.get(encoding);
            // post模式且带上传文件
            httpClient = getHttpClient();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setConfig(requestConfig);
            // 创建提交
            MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
            // 开启浏览器兼容模式
            multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
            // 设置编码集
            multipartEntityBuilder.setCharset(charset);
            // 非文件参数
            for (Map.Entry<String, String> entry : params.entrySet()) {
                StringBody value = new StringBody(entry.getValue(), ContentType.create("text/plain", charset));
                multipartEntityBuilder.addPart(entry.getKey(), value);
            }
            // 文件参数
            for (File file : files) {
                FileBody fileBody = new FileBody(file);
                multipartEntityBuilder.addPart(new String(file.getName().getBytes(), charset), fileBody);
            }
            // httpEntity
            HttpEntity httpEntity = multipartEntityBuilder.build();
            httpPost.setEntity(httpEntity);
            // 执行
            response = httpClient.execute(httpPost);
            // http 状态码
            int statusCode = response.getStatusLine().getStatusCode();
            result = EntityUtils.toString(response.getEntity(), Consts.UTF_8);
            if (statusCode != HttpStatus.SC_OK) {
                throw new Exception("发送HTTP-FILE请求:"   url   "出现异常,返回内容为:"   result);
            }
        } catch (Exception e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);
            throw new Exception(e.getMessage(), e);
        } finally {
            response.close();
            httpClient.close();
        }
        return result;
    }

    /**
     * 获取http连接
     * 
     * @return
     * @throws Exception
     * @author dubl
     */
    public static CloseableHttpClient getHttpClient() throws Exception {
        CloseableHttpClient httpClient = null;
        try {
            // 创建连接
            httpClient = HttpClients.createDefault();
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("创建http连接出错。"   e.getMessage());
        }
        return httpClient;
    }

    /**
     * 发送get请求
     * 
     * @param url
     * @param method
     * @param params
     * @return
     * @throws Exception
     */
    private static CloseableHttpResponse sendGetRequest(String url, Map<String, String> params) throws Exception {
        HttpGet httpGet = new HttpGet();
        httpGet.setConfig(requestConfig);
        if (params != null && params.size() > 0) {
            // 组装get 带参url
            StringBuffer urlParams = new StringBuffer(url   "?");
            for (Map.Entry<String, String> entry : params.entrySet()) {
                if (urlParams.toString().endsWith("?")) {
                    urlParams.append(entry.getKey()   "="   entry.getValue());
                } else {
                    urlParams.append("&"   entry.getKey()   "="   entry.getValue());
                }
            }
            httpGet.setURI(new URI(urlParams.toString()));
        } else {
            httpGet.setURI(new URI(url));
        }
        return getHttpClient().execute(httpGet);
    }

    /**
     * 发送post请求
     * 
     * @param url
     * @param method
     * @param params
     * @return
     * @throws Exception
     */
    private static CloseableHttpResponse sendPostRequest(String url, Map<String, String> params) throws Exception {
        HttpPost httpPost = new HttpPost(url);
        httpPost.setConfig(requestConfig);
        if (params != null && params.size() > 0) {
            List<NameValuePair> nvpList = new ArrayList<NameValuePair>();
            for (Map.Entry<String, String> entry : params.entrySet()) {
                nvpList.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
            }
            httpPost.setEntity(new UrlEncodedFormEntity(nvpList, encoding));
        }

        return getHttpClient().execute(httpPost);
    }

    /**
     * 获取request的IP地址
     * 
     * @param request
     * @return
     * @throws Exception
     * @author dubl
     */
    public static String getRequestIp(HttpServletRequest request) throws Exception {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip;
    }
}

2、小程序成效设计

首先大家来会见主体分界面包车型大巴功用图,然后在进展分析具体的作用完结,具体分界面效果如下所示。

博客小说列表内容如下所示:

上海时时乐走势图官网 1

文章详细分界面效果如下所示:

上海时时乐走势图官网 2

这几个文章直接都以从天涯论坛页面中获取,并因此Javascript的正则表达式实行领取,然后映今后小程序上的,对于HTML内容的来得大家依旧采用了WxParse的这几个HTML分析组件,具体作用和行使进程能够参照作者事先的随笔《在微信小程序中利用富文本转化插件wxParse 》举行详细摸底。对于Javascript函数的包装,大家依然选择比较便利的Promise进行打包管理,具体知识能够参照笔者小说《在微信小程序的JS脚本中使用Promise来优化函数管理 》实行详尽摸底。

平时大家也筹算把公用方法提抽出来,放到工具类Utils/util.js里面,配置统一置于utils/config.js里面,那样便于小程序的模块化管理。

品种的文件目录如下所示。

上海时时乐走势图官网 3

在Utils/util.js里面,大家封装了wx.request的获得内容措施如下所示。

//封装Request请求方法
function request(url,method,data = {},type='application/json'){
  wx.showNavigationBarLoading();

  return new Promise((resove,reject) => {
    wx.request({
      url: url,
      data: data,
      header: {'Content-Type': type},
      method: method.toUpperCase(), // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
      success: function(res){
        wx.hideNavigationBarLoading()
        resove(res.data)
      },
      fail: function(msg) {
        console.log('reqest error',msg)
        wx.hideNavigationBarLoading()
        reject('fail')
      }
    })
  })
}

而在Config.js里面,大家第一定义好一些常用的参数,如UENVISIONL等

上海时时乐走势图官网 4

在列表页面,大家任重(Ren Zhong)而道远是显得文字标题和日期等音讯,而列表是亟需滚动翻页的,由此我们采纳微信界面组件 scroll-view 来展示,具体分界面代码如下所示。

<block wx:if="{{showLoading}}">
    <view class="loading">玩命加载中…</view>
</block>
<block wx:else>
    <scroll-view scroll-y="true" style="height: {{windowHeight}}rpx" scroll-top="{{scrollTop}}" bindscroll="scroll" bindscrolltolower="scrolltolower">
        <view class="blog">
            <block wx:for="{{blogs}}" wx:for-index="blogIndex" wx:for-item="blogItem" wx:key="blog">
                <view data-id="{{blogItem.id}}" catchtap="viewBlogDetail" class="flex box box-lr item">
                  <view class="flex item_left">
                    <view><text class="title">{{blogItem.title}}</text></view>
                    <view><text class="sub_title">{{blogItem.date}}</text></view>
                  </view>
                </view> 
            </block>
            <block wx:if="{{hasMore}}">
                <view class="loading-tip">拼命加载中…</view>
            </block>
            <block wx:else>
                <view class="loading-tip">没有更多内容了</view>
            </block>
        </view>
    </scroll-view>
</block>

因而绑定向下滑动的风云 bindscrolltolower="scrolltolower" 我们得以兑现列表内容的滚动刷新。

我们经过后面介绍的封装Request方法,能够获得到HTML内容,如下函数所示。

  //获取博客文章列表
  getList:function(start =1) {
      return new Promise((resolve, reject) => {
        var that = this;
        var data = {};
        var type = "text/html";
        var url = config.mainblog_url   start;

        if (that.data.hasMore) {
          app.utils.get(url, data, type).then(res => {

经过点名type = "text/html",何况传入对应的初阶地方,能够收获到对应页面包车型客车内容。

在和讯里头,【笔者的随笔】里面的标准UTiggoL地址为: n 是时下的页码。

页面上的页码效果如下所示:

上海时时乐走势图官网 5

剖判页面源码,能够看出页码标签的源码如下所示。

上海时时乐走势图官网 6

就此大家对HTML源码实行正则表明式的相称就可以获得相应的内容(关键是得到多少页,为前面循环获取小说列表做盘算)。

有关正则表达式的测量试验,提出选拔RegExBuilder( Regulator 2.0那些很好的程序测量检验正则表达式,然而这些软件常常性的无法运行使用。

唯独新兴测量试验使用RegExBuilder,也认为不行不易,在那之中勾选ECMAScript是为着大家在Javascript使用正则表明式的选项,毕竟和在C#里面使用正则标记仍然有一点异样,如不援救单行选拔,以致一些分寸区别。

上海时时乐走势图官网 7

对于在Javascript中央银行使正则标记,提出大家复习下下边几篇小说,有所支持:

《浅显的javascript的正则表明式学习课程》

《采取javascript正则表达式完结遍历html字符串》

 《JavaScript之正则表明式》

 以致一个分布的坑,在HTML内容非常的时候,不扶助.*这种很平日的格局,这种由于不能够选取单行形式导致的,变通的议程是运用[sS]来贯彻相配全体字符处理。

能够参谋小说: 了解下。

别的对于Javascript的正则书写,平常看见i,g,m的告竣符

修饰符   描述
    i    (ignore case)
    执行对大小写不敏感的匹配。    
    g    (global search)
    执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。    
    m    (multiline)
    执行多行匹配。    

它的情趣你仿照效法小说精通:

Javascript的正则相配管理,支撑正则表达式的String对象的格局能够动用search()方法、match()方法、replace()方法、split()方法、**

**RegExp对象方法包涵:4.5.2HttpClientUtil【上海时时乐走势图官网】。**test()方法、exec()方法。**

实际Javascript的正则表明式使用,能够好好学习下《浅显的javascript的正则表明式学习课程》,就很清楚了。

举个例子对于我们那篇小程序,我们得到页码的js代码如下所示。

  var reg = /共(d{0,})页/g;
  var pageNum = reg.exec(html)[1];
  //console.log(pageNum);

  that.setData({
    end:pageNum, //设置最大页码
  });

 

在收获每篇小说文章的标题、U奥德赛L、日期等消息,作者编写了一个正则表明式来协作,如下所示。

var regContent=/class="postTitl2">.*?href="(.*?)">(.*?)</a>.*?class="postDesc2">(.*?)s*阅读:.*?</div>/igm;

正则表明式的剧情,在利用前,一定须求在此个工具上测量试验,测验通过了作者们再在代码上应用,缩小调节和测验错误的时刻。

上边包车型客车测量试验结果如下所示。

上海时时乐走势图官网 8

取得小说列表音讯的小程序js代码如下所示。

上海时时乐走势图官网 9

在前边介绍的列表展现界面代码里面,我们绑定了单击连接的风云,如下分界面所示标记所示。

上海时时乐走势图官网 10

4.5.2HttpClientUtil【上海时时乐走势图官网】。以这事件便是接触导航到详细分界面,如下所示,我们把U汉兰达L作为id传入到详细的分界面里面。

  viewBlogDetail: function(e) {
    var data = e.currentTarget.dataset;
    var url = data.id;
    // console.log(url);
    wx.navigateTo({
      url: "../details/details?id="   data.id
    })
  },

在篇章详细分界面显得里面,分界面包车型大巴代码如下所示。

<import src="../../utils/wxParse/wxParse.wxml" />
<view class="flex box box-lr item">
    <view class="flex item_left">
        <view>
            <text class="title">{{detail.title}}</text>
        </view>
    </view>
</view>
<view class="page">
    <view class="page__bd">
        <view class="weui-article">
            <view class="weui-article__p">
                <template is="wxParse" data="{{wxParseData:article.nodes}}"/>
             </view>
        </view>
    </view>
</view>

那边引进了WxParse作为HTML内容解析的零部件,大家在页面代码顶端引进组件代码

<import src="../../utils/wxParse/wxParse.wxml" />

实际处理的内容在JS代码里面,大家的JS代码如下所示。

  //获取文章详细内容
  getDetail(url) {    
    var that = this;
    var type = "text/html";
    app.utils.get(url, {}, type).then(res => { 
        // console.log(res);
        var html = res;
        var regContent = /id="cb_post_title_url".*?>([sS]*?)</a>[sS]*?id="cnblogs_post_body">([sS]*?)</div><divs*id="MySignature">/igm
        var matchArr;
        if ((matchArr = regContent.exec(html))) {
            var detail = {
              id: url,
              title : matchArr[1],   //titile
              content : matchArr[2],  //content
            };

            that.setData({
              detail:detail
            });
            WxParse.wxParse('article', 'html', detail.content, that, 5);              
        };
    });
  },

 个中的Javascript的正则表明式如下:

var regContent = /id="cb_post_title_url".*?>([sS]*?)</a>[sS]*?id="cnblogs_post_body">([sS]*?)</div><divs*id="MySignature">/igm

我们在工具上测量试验,获得有关的效率后再在代码上使用。

上海时时乐走势图官网 11

最终就可以获得详细的显得效果了,小说详细分界面效果如下所示:

上海时时乐走势图官网 12

 

上海时时乐走势图官网 13  

不久前给全部系统做了升迁后意识框架中httpclient占用系统财富后比重非常大,在各样baidu,google后发掘是4.3以下版本的国有失常态,因而一狠心进级到了最新的4.5.2。发掘以前好多方法都报黄了和出现斜杠了。。。 有洁癖见不得那样的东西冒出在框架中之所以从新包装了一套。封装的不佳,各位大神轻喷。。。直接贴。。。

1、Request接口合法域名配置

诚如景观下,大家驾驭微信的Request央浼是内需配置合法的域名的,这种安全性能够是微信拦截有秘密危急的要么不欣赏的域名接口,Request合法域名配置界面如下所示。

上海时时乐走势图官网 14

相似景观下,大家在上边扩大法定域名就能够,那样小程序宣布后,就能够顺利通过检查并获取数据了,本篇小说由于想读取果壳网个体天涯论坛的小说,由此要求配置博客园的域名,然则非常不幸,新浪的域名上了黑名单被剥夺了。

上海时时乐走势图官网 15

只要我们在付出条件,大家得以由此不分包对官方域名的核算管理,可是在开采条件必需撤回勾选“不校验”。

上海时时乐走势图官网 16

 

     本次实在撤退了啊,后天见

上海时时乐走势图官网 17

自己又杀回来了,刚刚写了篇不太舒心,计划在来一篇

本文由上海时时乐走势图发布于web前端,转载请注明出处:4.5.2HttpClientUtil【上海时时乐走势图官网】

您可能还会对下面的文章感兴趣: