• 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;

           }

    }

  • 相关阅读:
    NetCore+Dapper WebApi架构搭建(三):添加实体和仓储
    NetCore+Dapper WebApi架构搭建(二):底层封装
    NetCore+Dapper WebApi架构搭建(一):基本框架
    net core WebApi——缓存神器Redis
    net core Webapi基础工程搭建(六)——数据库操作_Part 2
    net core Webapi基础工程搭建(七)——小试AOP及常规测试_Part 2
    springBoot+mybatisPlus小demo
    JAVA并发(一)
    tomcat解析
    JAVA并发-线程状态
  • 原文地址:https://www.cnblogs.com/kfsrex/p/11704282.html
Copyright © 2020-2023  润新知