zoukankan      html  css  js  c++  java
  • HTTPCLIENT

    1.   httpclient介绍

    HttpClient是Apache Jajarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。

    HttpClient和浏览器有点像,但不是浏览器,它是一个HTTP通信库,因此它只提供一个通用浏览器应用程序所期望的功能子集,最根本的区别是HttpClient中没有用户界面。

    2.   快速使用httpclient

    a)      引入jar包(Maven在pom.xml中引入HttpClient依赖)

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

      <modelVersion>4.0.0</modelVersion>

      <groupId>com.test</groupId>

      <artifactId>com-test</artifactId>

      <version>0.0.1-SNAPSHOT</version>

           <dependencies>

                  <!-- httpclient -->

                  <dependency>

                         <groupId>org.apache.httpcomponents</groupId>

                         <artifactId>httpclient</artifactId>

                         <version>4.3.5</version>

                  </dependency>

                  <!-- Jackson Json处理工具包 -->

                  <dependency>

                         <groupId>com.fasterxml.jackson.core</groupId>

                         <artifactId>jackson-databind</artifactId>

                         <version>2.4.2</version>

                  </dependency>

           </dependencies>

    </project>

    b)      get无参

           /**

            *   无参get

            */

           public static void testGet() {

                  //1.通过HttpClientBuilder类的create方法创建HttpClientBuilder对象,再用HttpClientBuilder对象的builder方法创建closeableHttpClient对象;    相当于浏览器

                  CloseableHttpClient closeableHttpClient=HttpClientBuilder.create().build();

                  //2.创建httpGet对象   相当于在地址栏输入网址

                  HttpGet httpGet=new HttpGet("http://127.0.0.1:7001/rest/user/list");

                  CloseableHttpResponse httpResponse =null;

                  try {

                         //3.通过closeableHttpClient对象的execute方法创建httpResponse对象    相当于按回车键(访问网址)

                         httpResponse = closeableHttpClient.execute(httpGet);

                        

                         System.out.println(EntityUtils.toString(httpResponse.getEntity()));

                  } catch (IOException e) {

                         e.printStackTrace();

                  }finally {

                         try {

                                if(httpResponse!=null) {

                                       httpResponse.close();

                                }

                                if(closeableHttpClient!=null) {

                                       closeableHttpClient.close();

                                }

                         } catch (IOException e) {

                                e.printStackTrace();

                         }

                  }

           }

    c)      get有参

           /**

            *   有参get

            */

           public static void testGetParams() {

                  //1.通过HttpClientBuilder类的create方法创建HttpClientBuilder对象,再用HttpClientBuilder对象的builder方法创建closeableHttpClient对象;    相当于浏览器

                  CloseableHttpClient closeableHttpClient=HttpClientBuilder.create().build();

                  //2.创建httpGet对象   相当于在地址栏输入网址

    //            HttpGet httpGet=new HttpGet("http://127.0.0.1:7001/rest/user/list?rows=1");//第一种方式.在地址上加?后跟参数

                  CloseableHttpResponse httpResponse =null;

                  try {

                         /*

                          * 第二种方式.通过URIBuilder类的add方法添加参数,在通过build方法得到uri对象

                          */

                         URI uri=new URIBuilder("http://127.0.0.1:7001/rest/user/list").addParameter("rows", "1").build();

                         HttpGet httpGet=new HttpGet(uri);

                        

                         //3.通过closeableHttpClient对象的execute方法创建httpResponse对象    相当于按回车键(访问网址)

                         httpResponse = closeableHttpClient.execute(httpGet);

                        

                         System.out.println(EntityUtils.toString(httpResponse.getEntity()));

                  } catch (IOException e) {

                         e.printStackTrace();

                  } catch (URISyntaxException e) {

                         e.printStackTrace();

                  }finally {

                         try {

                                if(httpResponse!=null) {

                                       httpResponse.close();

                                }

                                if(closeableHttpClient!=null) {

                                       closeableHttpClient.close();

                                }

                         } catch (IOException e) {

                                e.printStackTrace();

                         }

                  }

           }

    d)      post无参

           /**

            *   无参post

            */

           public static void testPost() {

                  //1.通过HttpClientBuilder类的create方法创建HttpClientBuilder对象,再用HttpClientBuilder对象的builder方法创建closeableHttpClient对象;    相当于浏览器

                  CloseableHttpClient closeableHttpClient=HttpClientBuilder.create().build();

                  //2.创建httpPost对象  相当于在地址栏输入网址

                  HttpPost httpPost=new HttpPost("http://127.0.0.1:7001/rest/user/list");

                  CloseableHttpResponse httpResponse =null;

                  try {

                         //3.通过closeableHttpClient对象的execute方法创建httpResponse对象    相当于按回车键(访问网址)

                         httpResponse = closeableHttpClient.execute(httpPost);

                        

                         System.out.println(EntityUtils.toString(httpResponse.getEntity()));

                  } catch (IOException e) {

                         e.printStackTrace();

                  }finally {

                         try {

                                if(httpResponse!=null) {

                                       httpResponse.close();

                                }

                                if(closeableHttpClient!=null) {

                                       closeableHttpClient.close();

                                }

                         } catch (IOException e) {

                                e.printStackTrace();

                         }

                  }

           }

    e)      post简单(基本类型,string,数组)参

           /**

            *   简单参post

            */

           public static void testPostParams() {

                  //1.通过HttpClientBuilder类的create方法创建HttpClientBuilder对象,再用HttpClientBuilder对象的builder方法创建closeableHttpClient对象;    相当于浏览器

                  CloseableHttpClient closeableHttpClient=HttpClientBuilder.create().build();

                  //2.创建httpGet对象   相当于在地址栏输入网址

    //            HttpPost httpPost=new HttpPost("http://127.0.0.1:7001/rest/user/list?rows=1");//第一种方式.在地址上加?后跟参数

                  CloseableHttpResponse httpResponse =null;

                  try {

                         /*

                          * 第二种方式.通过URIBuilder类的add方法添加参数,在通过build方法得到uri对象

                          */

                         URI uri=new URIBuilder("http://127.0.0.1:7001/rest/user/list").addParameter("ids", "1,2").build();//addParameter("ids", "1,2")传出去的是个数组

                         HttpPost httpPost=new HttpPost(uri);

                        

                         //3.通过closeableHttpClient对象的execute方法创建httpResponse对象    相当于按回车键(访问网址)

                         httpResponse = closeableHttpClient.execute(httpPost);

                        

                         System.out.println(EntityUtils.toString(httpResponse.getEntity()));

                  } catch (IOException e) {

                         e.printStackTrace();

                  } catch (URISyntaxException e) {

                         e.printStackTrace();

                  }finally {

                         try {

                                if(httpResponse!=null) {

                                       httpResponse.close();

                                }

                                if(closeableHttpClient!=null) {

                                       closeableHttpClient.close();

                                }

                         } catch (IOException e) {

                                e.printStackTrace();

                         }

                  }

           }

    f)       post简单参+对象:控制层接收的对象前一定要加注解@RequestBody,否则报错415

           /**

            *   对象+简单参post

            */

           public static void testPostParam() {

                  ObjectMapper objectMapper=new ObjectMapper();//json字符串和java对象互转

                  //1.通过HttpClientBuilder类的create方法创建HttpClientBuilder对象,再用HttpClientBuilder对象的builder方法创建closeableHttpClient对象;    相当于浏览器

                  CloseableHttpClient closeableHttpClient=HttpClientBuilder.create().build();

                  //2.创建httpGet对象   相当于在地址栏输入网址

                  CloseableHttpResponse httpResponse =null;

                  try {

                         /*

                          * 第一种方式.通过URIBuilder类的add方法添加参数,在通过build方法得到uri对象

                          */

                         URI uri=new URIBuilder("http://127.0.0.1:7001/rest/user/list").addParameter("ids", "1,2").build();//addParameter("ids", "1,2")传出去的是个数组

                         HttpPost httpPost=new HttpPost(uri);

                         //创建user对象

                         User user=new User(null, "测试", null, null, null, null, null, null, null);

                         //把user对象转成json字符串放到创建的StringEntity对象里,然后再用httpPost对象添加对象

                         httpPost.setEntity(new StringEntity(objectMapper.writeValueAsString(user),"utf-8"));

                        

                         //一定要设置http头部信息

                         httpPost.setHeader("Content-Type", "application/json;charset=utf8");

                        

                         //3.通过closeableHttpClient对象的execute方法创建httpResponse对象    相当于按回车键(访问网址)

                         httpResponse = closeableHttpClient.execute(httpPost);

                        

                         System.out.println(EntityUtils.toString(httpResponse.getEntity()));

                  } catch (IOException e) {

                         e.printStackTrace();

                  } catch (URISyntaxException e) {

                         e.printStackTrace();

                  }finally {

                         try {

                                if(httpResponse!=null) {

                                       httpResponse.close();

                                }

                                if(closeableHttpClient!=null) {

                                       closeableHttpClient.close();

                                }

                         } catch (IOException e) {

                                e.printStackTrace();

                         }

                  }

           }

    g)      连接管理器PoolHttpClientConnectionManager和请求配置器RequestConfig

           /**

            *   1.连接管理器PoolingHttpClientConnectionManager,2.请求配置RequestConfig

            */

           public static void testPoolAndConfig() {

                  //1.创建连接管理器PoolingHttpClientConnectionManager

                  PoolingHttpClientConnectionManager cm=new PoolingHttpClientConnectionManager();

                  cm.setMaxTotal(10);//设置最大连接数

                  cm.setDefaultMaxPerRoute(5);//设置最大路由数

                  doGet(cm);

                  doGet(cm);

                 

           }

           public static void doGet(PoolingHttpClientConnectionManager cm) {

                  //通过HttpClients的custom方法获得HttpClientBuilder对象,在用setConnectionManager方法设置连接管理器,再用build创建closeableHttpClient对象

                  CloseableHttpClient closeableHttpClient = HttpClients.custom().setConnectionManager(cm).build();

                  HttpGet httpGet=new HttpGet("http://127.0.0.1:7001/rest/user/list?rows=1");

                 

                  //2.配置requestConfig

                  RequestConfig requestConfig=RequestConfig.custom().setConnectTimeout(5000)//设置连接最大时间

                                .setConnectionRequestTimeout(3000)//设置连接请求最大时间

                                .setSocketTimeout(2000).build();//设置传输最大时间

                  httpGet.setConfig(requestConfig);//把requestConfig设置到httpGet对象里

                 

                  CloseableHttpResponse httpResponse =null;

                  try {

                         httpResponse=closeableHttpClient.execute(httpGet);

                         System.out.println(EntityUtils.toString(httpResponse.getEntity()));

                  } catch (IOException e) {

                         e.printStackTrace();

                  }finally {

                         try {

                                if(httpResponse!=null) {

                                       httpResponse.close();

                                }

    //                          if(closeableHttpClient!=null) {

    //                                 closeableHttpClient.close();//一定不能close,否则报错:Exception in thread "main" java.lang.IllegalStateException: Connection pool shut down

    //                          }

                         } catch (IOException e) {

                                e.printStackTrace();

                         }

                  }

           }

    Spring和HttpClient整合(spring和httpclient的配置文件,httpclient的公共ApiService)

    1.spring和httpclient配置文件:applicationContent-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"

           xmlns:context="http://www.springframework.org/schema/context"

           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

                  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">

          

           <!-- 配置连接管理器 -->

           <bean id="cm" class="org.apache.http.impl.conn.PoolingHttpClientConnectionManager">

                  <property name="maxTotal" value="200"/>

                  <property name="defaultMaxPerRoute" value="50"/>

           </bean>

          

           <!-- 配置HttpClientBuilder用来创建CloseableHttpClient对象 -->

           <bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder">

                  <property name="connectionManager" ref="cm"/>

           </bean>

           <!-- 创建CloseableHttpClient对象 -->

           <bean id="closeableHttpClient" class="org.apache.http.impl.client.CloseableHttpClient" factory-bean="httpClientBuilder" factory-method="build" scope="prototype">

           </bean>

          

           <!-- 配置Builder对象来获得RequestConfig对象 -->

           <bean id="builder" class="org.apache.http.client.config.RequestConfig.Builder">

                  <property name="connectTimeout" value="5000"/>

                  <property name="connectionRequestTimeout" value="3000"/>

                  <property name="socketTimeout" value="2000"/>

           </bean>

           <bean id="requestConfig" class="org.apache.http.client.config.RequestConfig" factory-bean="builder" factory-method="build">

           </bean>

    </beans>

    2.公共的ApiService接口和实现类

    ApiService接口:

    package com.zhiyou100.kfs.service;

    import java.util.Map;

    import com.zhiyou100.kfs.bean.HttpResult;

    public interface ApiService {

          

           /**

            *   无参get

            * @param url

            */

           String doGet(String url);

          

           /**

            *   有参get

            * @param url

            * @param map

            * @return

            */

           String doGet(String url,Map<String, Object> map);

          

           /**

            *   无参post

            * @param url

            * @return

            */

           String doPost(String url);

          

           /**

            *   有参post

            * @param url

            * @param map

            * @return

            */

           HttpResult doPost(String url,Map<String, Object> map);

    }

    接口实现类ApiServiceImp:

    package com.zhiyou100.kfs.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 org.apache.http.NameValuePair;

    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.stereotype.Service;

    import com.zhiyou100.kfs.bean.HttpResult;

    /**

     *   把httpclient抽取出来

     * @author KFS

     *

     */

    @Service

    public class ApiServiceImp implements ApiService{

           @Autowired

           private CloseableHttpClient closeableHttpClient;

           @Autowired

           private RequestConfig requestConfig;

          

           /**

            *   无参get

            * @param url

            */

           public String doGet(String url) {

                  HttpGet httpGet=new HttpGet(url);

                  httpGet.setConfig(requestConfig);

                 

                  CloseableHttpResponse httpResponse =null;

                  try {

                         httpResponse = closeableHttpClient.execute(httpGet);

                         if(httpResponse!=null&&httpResponse.getStatusLine().getStatusCode()==200) {

                                return EntityUtils.toString(httpResponse.getEntity(),"utf-8");

                         }

                  } catch (IOException e) {

                         e.printStackTrace();

                  }

                  return null;

           }

          

           /**

            *   有参get

            * @param url

            * @param map

            * @return

            */

           public String doGet(String url,Map<String, Object> map) {

                  List<NameValuePair> nvps=new ArrayList<>();

                  if(!map.isEmpty()) {

                         for(String key:map.keySet()) {

                                NameValuePair nvp=new BasicNameValuePair(key, map.get(key).toString());

                                nvps.add(nvp);

                         }

                  }

                 

                  CloseableHttpResponse httpResponse =null;

                  try {

                         URI uri=new URIBuilder(url).addParameters(nvps).build();

                         HttpGet httpGet=new HttpGet(uri);

                         httpGet.setConfig(requestConfig);

                        

                         httpResponse = closeableHttpClient.execute(httpGet);

                         if(httpResponse!=null&&httpResponse.getStatusLine().getStatusCode()==200) {

                                return EntityUtils.toString(httpResponse.getEntity(),"utf-8");

                         }

                  } catch (IOException e) {

                         e.printStackTrace();

                  } catch (URISyntaxException e) {

                         e.printStackTrace();

                  }

                  return null;

           }

          

           /**

            *   无参post

            * @param url

            * @return

            */

           public String doPost(String url) {

                  HttpPost httpPost=new HttpPost(url);

                  httpPost.setConfig(requestConfig);

                 

                  CloseableHttpResponse httpResponse =null;

                  try {

                         httpResponse = closeableHttpClient.execute(httpPost);

                         if(httpResponse!=null&&httpResponse.getStatusLine().getStatusCode()==200) {

                                return EntityUtils.toString(httpResponse.getEntity(),"utf-8");

                         }

                  } catch (IOException e) {

                         e.printStackTrace();

                  }

                  return null;

           }

          

           /**

            *   有参post

            * @param url

            * @param map

            * @return

            */

           public HttpResult doPost(String url,Map<String, Object> map) {

                  List<NameValuePair> nvps=new ArrayList<>();

                  if(!map.isEmpty()) {

                         for(String key:map.keySet()) {

                                NameValuePair nvp=new BasicNameValuePair(key, map.get(key).toString());

                                nvps.add(nvp);

                         }

                  }

                 

                  CloseableHttpResponse httpResponse =null;

                  try {

                         URI uri=new URIBuilder(url).addParameters(nvps).build();

                         HttpPost httpPost=new HttpPost(uri);

                         httpPost.setConfig(requestConfig);

                        

                         httpResponse = closeableHttpClient.execute(httpPost);

                         if(httpResponse!=null&&httpResponse.getStatusLine().getStatusCode()==200) {

                                return new HttpResult(httpResponse.getStatusLine().getStatusCode(),EntityUtils.toString(httpResponse.getEntity(),"utf-8"));

                         }

                  } catch (IOException e) {

                         e.printStackTrace();

                  } catch (URISyntaxException e) {

                         e.printStackTrace();

                  }

                  return null;

           }

    }

  • 相关阅读:
    Ubuntu adb devices :???????????? no permissions (verify udev rules) 解决方法
    ubuntu 关闭显示器的命令
    ubuntu android studio kvm
    ubuntu 14.04版本更改文件夹背景色为草绿色
    ubuntu 创建桌面快捷方式
    Ubuntu 如何更改用户密码
    ubuntu 14.04 返回到经典桌面方法
    ubuntu 信使(iptux) 创建桌面快捷方式
    Eclipse failed to get the required ADT version number from the sdk
    Eclipse '<>' operator is not allowed for source level below 1.7
  • 原文地址:https://www.cnblogs.com/kfsrex/p/11704282.html
Copyright © 2011-2022 走看看