zoukankan      html  css  js  c++  java
  • 跨域请求httpclient

    httpclient:是Apache工具包,util,它可以作为一个爬虫,直接爬取某个互联网上的页面。获取到时页面最终的源文件html。直接可以获取页面返回json。就可以直接在代码内部模拟发起http请求。请求的结果也被捕捉。在代码内部将获取的json,利用JacksonObjectMapper对象,把json字符串转成java对象。

    与Spring框架整合:

    1、引入jar支持

    <!-- httpclient -->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.3.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpmime</artifactId>
        <version>4.3.1</version>
    </dependency>

    2、applicationContext-httpclient.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:p="http://www.springframework.org/schema/p" 
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
    
        <!-- 定义httpclient连接池 -->
        <bean id="httpClientConnectionManager" class="org.apache.http.impl.conn.PoolingHttpClientConnectionManager" destroy-method="close">
            <!-- 设置连接总数 -->
            <property name="maxTotal" value="${http.pool.maxTotal}"></property>
            <!-- 设置每个地址的并发数 -->
            <property name="defaultMaxPerRoute" value="${http.pool.defaultMaxPerRoute}"></property>
        </bean>
        
        <!-- 定义 HttpClient工厂,这里使用HttpClientBuilder构建-->
        <bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder" factory-method="create">
            <property name="connectionManager" ref="httpClientConnectionManager"></property>
        </bean>
        
        <!-- 得到httpClient的实例 -->
        <bean id="httpClient" factory-bean="httpClientBuilder" factory-method="build"/>
        
        <!-- 定期清理无效的连接 -->
        <bean class="com.jt.common.util.IdleConnectionEvictor" destroy-method="shutdown">
            <constructor-arg index="0" ref="httpClientConnectionManager" />
            <!-- 间隔一分钟清理一次 -->
            <constructor-arg index="1" value="600000" />
        </bean>
        
        <!-- 定义requestConfig的工厂 -->
        <bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig.Builder">
            <!-- 从连接池中获取到连接的最长时间 -->
            <property name="connectionRequestTimeout" value="${http.request.connectionRequestTimeout}"/>
            <!-- 创建连接的最长时间 -->
            <property name="connectTimeout" value="${http.request.connectTimeout}"/>
            <!-- 数据传输的最长时间 -->
            <property name="socketTimeout" value="${http.request.socketTimeout}"/>
            <!-- 提交请求前测试连接是否可用 -->
            <property name="staleConnectionCheckEnabled" value="${http.request.staleConnectionCheckEnabled}"/>
        </bean>    
        
        <!-- 得到requestConfig实例 -->
        <bean id="requestConfig" factory-bean="requestConfigBuilder" factory-method="build" />
        
    
    </beans>

    3、把httpClient对象封装成伪service。在程序中注入,封装doGet,doPost,doJson-    ---- HttpClientService:

    package com.jt.common.service;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.http.NameValuePair;
    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.StringEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class HttpClientService {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(HttpClientService.class);
    
        @Autowired(required=false)
        private CloseableHttpClient httpClient;
    
        @Autowired(required=false)
        private RequestConfig requestConfig;
    
        /**
         * 执行get请求
         * 
         * @param url
         * @return
         * @throws Exception
         */
        public String doGet(String url,Map<String, String> params,String encode) throws Exception {
            LOGGER.info("执行GET请求,URL = {}", url);
            if(null != params){
                URIBuilder builder = new URIBuilder(url);
                for (Map.Entry<String, String> entry : params.entrySet()) {
                    builder.setParameter(entry.getKey(), entry.getValue());
                }
                url = builder.build().toString();
            }
            // 创建http GET请求
            HttpGet httpGet = new HttpGet(url);
            httpGet.setConfig(requestConfig);
            CloseableHttpResponse response = null;
            try {
                // 执行请求
                response = httpClient.execute(httpGet);
                // 判断返回状态是否为200
                if (response.getStatusLine().getStatusCode() == 200) {
                    if(encode == null){
                        encode = "UTF-8";
                    }
                    return EntityUtils.toString(response.getEntity(), encode);
                }
            } finally {
                if (response != null) {
                    response.close();
                }
                // 此处不能关闭httpClient,如果关闭httpClient,连接池也会销毁
            }
            return null;
        }
        
        public String doGet(String url, String encode) throws Exception{
            return this.doGet(url, null, encode);
        }
        
        public String doGet(String url) throws Exception{
            return this.doGet(url, null, null);
        }
    
        /**
         * 带参数的get请求
         * 
         * @param url
         * @param params
         * @return
         * @throws Exception
         */
        public String doGet(String url, Map<String, String> params) throws Exception {
            return this.doGet(url, params, null);
        }
    
        /**
         * 执行POST请求
         * 
         * @param url
         * @param params
         * @return
         * @throws Exception
         */
        public String doPost(String url, Map<String, String> params,String encode) throws Exception {
            // 创建http POST请求
            HttpPost httpPost = new HttpPost(url);
            httpPost.setConfig(requestConfig);
    
            if (null != params) {
                // 设置2个post参数,一个是scope、一个是q
                List<NameValuePair> parameters = new ArrayList<NameValuePair>(0);
                for (Map.Entry<String, String> entry : params.entrySet()) {
                    parameters.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
                }
    
                // 构造一个form表单式的实体
                UrlEncodedFormEntity formEntity = null;
                if(encode!=null){
                    formEntity = new UrlEncodedFormEntity(parameters,encode);
                }else{
                    formEntity = new UrlEncodedFormEntity(parameters);
                }
                // 将请求实体设置到httpPost对象中
                httpPost.setEntity(formEntity);
            }
    
            CloseableHttpResponse response = null;
            try {
                // 执行请求
                response = httpClient.execute(httpPost);
                // 判断返回状态是否为200
                if (response.getStatusLine().getStatusCode() == 200) {
                    return EntityUtils.toString(response.getEntity(), "UTF-8");
                }
            } finally {
                if (response != null) {
                    response.close();
                }
            }
            return null;
        }
    
    
        /**
         * 执行POST请求
         * 
         * @param url
         * @param params
         * @return
         * @throws Exception
         */
        public String doPost(String url, Map<String, String> params) throws Exception {
            // 创建http POST请求
            HttpPost httpPost = new HttpPost(url);
            httpPost.setConfig(requestConfig);
    
            if (null != params) {
                // 设置2个post参数,一个是scope、一个是q
                List<NameValuePair> parameters = new ArrayList<NameValuePair>(0);
                for (Map.Entry<String, String> entry : params.entrySet()) {
                    parameters.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
                }
    
                // 构造一个form表单式的实体
                UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters);
                // 将请求实体设置到httpPost对象中
                httpPost.setEntity(formEntity);
            }
    
            CloseableHttpResponse response = null;
            try {
                // 执行请求
                response = httpClient.execute(httpPost);
                // 判断返回状态是否为200
                if (response.getStatusLine().getStatusCode() == 200) {
                    return EntityUtils.toString(response.getEntity(), "UTF-8");
                }
            } finally {
                if (response != null) {
                    response.close();
                }
            }
            return null;
        }
    
        public String doPostJson(String url, String json) throws Exception {
            // 创建http POST请求
            HttpPost httpPost = new HttpPost(url);
            httpPost.setConfig(requestConfig);
            
            if(null != json){
                //设置请求体为 字符串
                StringEntity stringEntity = new StringEntity(json,"UTF-8");
                httpPost.setEntity(stringEntity);
            }
    
            CloseableHttpResponse response = null;
            try {
                // 执行请求
                response = httpClient.execute(httpPost);
                // 判断返回状态是否为200
                if (response.getStatusLine().getStatusCode() == 200) {
                    return EntityUtils.toString(response.getEntity(), "UTF-8");
                }
            } finally {
                if (response != null) {
                    response.close();
                }
            }
            return null;
        }
    
    }

    4、在程序中注入httpClientService,直接调用doGet。

    5、在applicationContext.xml中加入<value>classpath:httpclient.properties</value>

      httpclient.properties:

     

    #从连接池中获取到连接的最长时间
    http.request.connectionRequestTimeout=500
    #5000
    http.request.connectTimeout=5000
    #数据传输的最长时间
    http.request.socketTimeout=30000
    #提交请求前测试连接是否可用
    http.request.staleConnectionCheckEnabled=true
    
    #设置连接总数
    http.pool.maxTotal=200
    #设置每个地址的并发数
    http.pool.defaultMaxPerRoute=100

     

     

     

  • 相关阅读:
    cnblog项目--20190309
    django js引入失效问题
    Python老男孩 day16 函数(六) 匿名函数
    Python老男孩 day16 函数(五) 函数的作用域
    Python老男孩 day15 函数(四) 递归
    Python老男孩 day15 函数(三) 前向引用之'函数即变量'
    Python老男孩 day15 函数(二) 局部变量与全局变量
    Python老男孩 day14 函数(一)
    Python老男孩 day14 字符串格式化
    Python老男孩 day14 集合
  • 原文地址:https://www.cnblogs.com/tongxuping/p/7289675.html
Copyright © 2011-2022 走看看