zoukankan      html  css  js  c++  java
  • 配置httpclient

    在分布式项目中,前端系统需要调用后台的数据并初始化时,可以使用httpclient通信器。先做一个测试

    一、导入需要的依赖

    <!-- httpclient -->
                <dependency>
                    <groupId>org.apache.httpcomponents</groupId>
                    <artifactId>httpclient</artifactId>
             版本为4.5.5
    </dependency>

    后台系统为manage_taotao,前端系统为web_taotao,设置的域名分别为manage.taotao.com 和web.taotao.com。在后台的一个test中写一个httpclient get请求

    @Test
        public void getTestOne() {
            // 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
            CloseableHttpClient httpClient = HttpClientBuilder.create().build();
            // 创建Get请求
            HttpGet httpGet = new HttpGet("http://localhost:8001/rest/test/doGetControllerOne");//controller层的测试地址
            // 响应模型
            CloseableHttpResponse response = null;
            try {
                // 由客户端执行(发送)Get请求
                response = httpClient.execute(httpGet);
                // 从响应模型中获取响应实体
                HttpEntity responseEntity = response.getEntity();
                System.out.println("响应状态为:" + response.getStatusLine());
                if (responseEntity != null) {
                    System.out.println("响应内容长度为:" + responseEntity.getContentLength());
                    System.out.println("响应内容为:" + EntityUtils.toString(responseEntity));
                }
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (ParseException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    // 释放资源
                    if (httpClient != null) {
                        httpClient.close();
                    }
                    if (response != null) {
                        response.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    写一个post请求

    @Test
        public void doPostTest() {
            CloseableHttpClient httpClient=HttpClientBuilder.create().build();
            try {
                URI uri=new URIBuilder("http://localhost:8001/rest/test/doGetControllerTwo").addParameter("name", "陈一峰")
                        .addParameter("age", "18").build();
                HttpPost post=new HttpPost(uri);
                CloseableHttpResponse response = httpClient.execute(post);
             // 从响应模型中获取响应实体
                HttpEntity responseEntity = response.getEntity();
                System.out.println("响应状态为:" + response.getStatusLine());
                if (responseEntity != null) {
                        System.out.println("响应内容长度为:" + responseEntity.getContentLength());
                        System.out.println("响应内容为:" + EntityUtils.toString(responseEntity,"utf-8"));
                }
            } catch (URISyntaxException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    json格式的post请求

    @Test
        public void doPostEntityTest() {
            ObjectMapper mapper=new ObjectMapper();
            CloseableHttpClient httpClient=HttpClientBuilder.create().build();
            try {
                URI uri=new URIBuilder("http://manage.taotao.com/rest/test/doPostEntity").build();
                
                HttpPost post=new HttpPost(uri);
                User user=new User();
                user.setName("陈一峰");
                user.setAge(24);
                user.setSex(1);
                HttpEntity entity=new StringEntity(mapper.writeValueAsString(user),"utf-8");
                post.setHeader("Content-Type","application/json;charset=utf-8");
                post.setEntity(entity);
                CloseableHttpResponse response = httpClient.execute(post);
             // 从响应模型中获取响应实体
                HttpEntity responseEntity = response.getEntity();
                System.out.println("响应状态为:" + response.getStatusLine());
                if (responseEntity != null) {
                        System.out.println("响应内容长度为:" + responseEntity.getContentLength());
                        System.out.println("响应内容为:" + EntityUtils.toString(responseEntity,"utf-8"));
                }
            } catch (URISyntaxException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    这里controller层代码,@requestbody注解将json对象转化为java对象,不过使用很严格

    @RequestMapping("doPostEntity")
        @ResponseBody
        public String test3(@RequestBody User user) {
            System.out.println(user);
            return "success";
        }

    跟数据库的链接池类似,httpclient也提供了链接管理器来提高效率

    @Test
        void test() {
            //创建一个链接管理器对象
           PoolingHttpClientConnectionManager cm=new PoolingHttpClientConnectionManager();
           cm.setMaxTotal(200);//最大连接对象个数
           cm.setDefaultMaxPerRoute(20);//最大路由个数
           getTestOne(cm);
           getTestOne(cm);
        }
        private void getTestOne(PoolingHttpClientConnectionManager cm) {
            // 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
            CloseableHttpClient httpClient = HttpClientBuilder.create().setConnectionManager(cm).build();
            // 创建Get请求
            HttpGet httpGet = new HttpGet("http://localhost:8001/rest/test/doGetControllerOne");
            RequestConfig config=RequestConfig.custom().setConnectTimeout(1000)//请求地址的超时时间
                    .setConnectionRequestTimeout(500)//从连接管理器中获取连接对象的超时时间
                    .setSocketTimeout(10000).build();//传送数据的超时时间
            httpGet.setConfig(config);
            // 响应模型
            CloseableHttpResponse response = null;
            try {
                // 由客户端执行(发送)Get请求
                response = httpClient.execute(httpGet);
                // 从响应模型中获取响应实体
                HttpEntity responseEntity = response.getEntity();
                System.out.println("响应状态为:" + response.getStatusLine());
                if (responseEntity != null) {
                    System.out.println("响应内容长度为:" + responseEntity.getContentLength());
                    System.out.println("响应内容为:" + EntityUtils.toString(responseEntity));
                }
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (ParseException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    response.close();
                    //注意:httpClient不能关闭
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

    在真正使用httpclient时,它的配置直接在xml中设置,部分代码抽取到公共service类里。

    applicationContext-httpclient.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        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.xsd">
    <!-- 创建连接管理器 -->
    <bean id="connectionManager" class="org.apache.http.impl.conn.PoolingHttpClientConnectionManager">
        <!-- 最大连接对象个数 -->
        <property name="maxTotal" value="200"/>
        <!-- 最大路由个数 -->
        <property name="defaultMaxPerRoute" value="20"/>
    </bean>
    
    <!-- 创建httpclient工厂 -->
    <bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder">
        <property name="connectionManager" ref="connectionManager"/>
    </bean>
    <!-- 创建一个httpclient对象 ,工厂模式-->
    <bean id="httpClient" class="org.apache.http.impl.client.CloseableHttpClient"
    factory-bean="httpClientBuilder" factory-method="build" scope="prototype"></bean>
    
    <!-- requestConfig设置,工厂模式 -->
    <bean class="org.apache.http.client.config.RequestConfig" factory-bean="configBuilder"
    factory-method="build"></bean>
    <!-- 设置config的工厂 -->
    <bean id="configBuilder" class="org.apache.http.client.config.RequestConfig.Builder">
        <!-- 请求地址的超时时间 -->
        <property name="connectTimeout" value="1000"/>
        <!-- 从连接管理器中获取连接对象的超时时间 -->
        <property name="connectionRequestTimeout" value="500"/>
        <!-- 传送数据的超时时间 -->
        <property name="socketTimeout" value="10000"/>
    </bean>
    </beans>

    抽取的ApiService

    package com.taotao.web.service;
    
    import java.io.IOException;
    import java.net.URI;
    import java.net.URISyntaxException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.config.RequestConfig;
    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.impl.client.CloseableHttpClient;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Service;
    
    import com.taotao.web.bean.HttpPostResult;
    
    @Service
    public class ApiService {
        @Autowired
        private CloseableHttpClient httpClient;
        @Autowired
        private RequestConfig config;
        
        @Value(value="${manage_url}")
        public final String MANAGE_URL=null;//使用属性文件
        /**
         * get请求 无参
         * @param url
         * @return
         */
        public String doGet(String url) {
            HttpGet get=new HttpGet(url);
            get.setConfig(config);
            CloseableHttpResponse response=null;
            try {
                response=httpClient.execute(get);
                HttpEntity responseEntity = response.getEntity();
                if (responseEntity != null) {
                    return EntityUtils.toString(responseEntity);
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                if(response!=null)
                    try {
                        response.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
            }return null;
            
        }
        /**
         * get请求 有参
         * @param url
         * @param map
         * @return
         */
        public String doGetParam(String url,Map<String,Object> map) {
            List<NameValuePair> nvps=new ArrayList<NameValuePair>();
            for(Entry<String,Object> entry:map.entrySet()) {
                nvps.add(new BasicNameValuePair(entry.getKey(),entry.getValue().toString()));
            }
            CloseableHttpResponse response=null;
            try {
                URI uri=new URIBuilder(url).addParameters(nvps).build();
                HttpGet get=new HttpGet(uri);
                
                response=httpClient.execute(get);
                HttpEntity responseEntity = response.getEntity();
                if (responseEntity != null) {
                    return EntityUtils.toString(responseEntity);
                    
                }
            } catch (URISyntaxException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                if(response!=null)
                    try {
                        response.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
            }return null;
        }
        /**
         * post请求 有参
         * @param url
         * @param map
         * @return
         */
        public HttpPostResult doPostParam(String url,Map<String,Object> map) {
            List<NameValuePair> nvps=new ArrayList<NameValuePair>();
            for(Entry<String,Object> entry:map.entrySet()) {
                nvps.add(new BasicNameValuePair(entry.getKey(),entry.getValue().toString()));
            }
            CloseableHttpResponse response=null;
            HttpPostResult result=null;
            try {
                URI uri=new URIBuilder(url).addParameters(nvps).build();
                HttpPost post=new HttpPost(uri);
                result=new HttpPostResult();
                response=httpClient.execute(post);
                result.setStatus(response.getStatusLine().getStatusCode());
                HttpEntity responseEntity = response.getEntity();
                if (responseEntity != null) {
                    result.setData(EntityUtils.toString(responseEntity));
                    
                }
            } catch (URISyntaxException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                if(response!=null)
                    try {
                        response.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
            }return result;
        }
    }

    由apiservice得到的字符串数据一般为json字符串,用jackson之类的jar包解析即可

  • 相关阅读:
    【转】Android Touch事件传递机制解析
    通过Selector来设置按钮enable/unable状态的样式
    Android中的selector
    Android单元测试
    Android Lint简介
    制作高仿QQ的聊天系统(下)—— Adapter & Activity
    EditText的监听器和自定义回车事件
    监听Listview的滚动状态,是否滚动到了顶部或底部
    制作高仿QQ的聊天系统(上)—— 布局文件 & 减少过度绘制
    数据更新后让ListView自动滚动到底部
  • 原文地址:https://www.cnblogs.com/psxfd4/p/11708424.html
Copyright © 2011-2022 走看看