HttpClient以及整合SpringBoot

一、HttpClient

1.1、 前台系统访问后台接口的方式

两个系统间如何互相访问?两个tomcat上的项目如何互相访问

采用HttpClient实现跨系统的接口调用。

1.2、 什么是HttpClient

在这里插入图片描述

官网:http://hc.apache.org/index.html

现在也叫:HttpComponents 在这里插入图片描述

特点:

  1. HttpClient别名:HttoComponents

  2. HttpClient可以发送get、post、put、delete、…等请求

在这里插入图片描述

在这里插入图片描述

1.3、 HttpClient入门案例

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.4</version>
</dependency>

1.3.1、 发起Get请求

1创建一个客户端 CloseableHttpClient

2创建一个get方法请求实例 HttpGet

3发送请求 execute

4获取响应的头信息

5获取响应的主题内容

6关闭响应对象

使用HttpClient发起Get请求的案例代码:

public class DoGET {

    public static void main(String[] args) throws Exception {
        // 创建Httpclient对象,相当于打开了浏览器
        CloseableHttpClient httpclient = HttpClients.createDefault();

        // 创建HttpGet请求,相当于在浏览器输入地址
        HttpGet httpGet = new HttpGet("http://www.baidu.com/");

        CloseableHttpResponse response = null;
        try {
            // 执行请求,相当于敲完地址后按下回车。获取响应
            response = httpclient.execute(httpGet);
            // 判断返回状态是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
                // 解析响应,获取数据
                String content = EntityUtils.toString(response.getEntity(), "UTF-8");
                System.out.println(content);
            }
        } finally {
            if (response != null) {
                // 关闭资源
                response.close();
            }
            // 关闭浏览器
            httpclient.close();
        }

    }
}

执行日志:

请求头:

在这里插入图片描述

响应头:

在这里插入图片描述

数据:

在这里插入图片描述

1.3.2、 带参数的Get请求

1创建一个客户端 CloseableHttpClient

2 通过URIBuilder传递参数

3创建一个get方法请求实例 HttpGet

4发送请求 execute

5获取响应的头信息

6获取响应的主题内容

7关闭响应对象

访问网站的爬虫协议:

在这里插入图片描述

public class DoGETParam {

   public static void main(String[] args) throws Exception {
       // 创建Httpclient对象
       CloseableHttpClient httpclient = HttpClients.createDefault();
       // 创建URI对象,并且设置请求参数
       URI uri = new URIBuilder("http://www.baidu.com/s").setParameter("wd", "java").build();
       // 创建http GET请求
       HttpGet httpGet = new HttpGet(uri);

       CloseableHttpResponse response = null;
       try {
           // 执行请求
           response = httpclient.execute(httpGet);
           // 判断返回状态是否为200
           if (response.getStatusLine().getStatusCode() == 200) {
               // 解析响应数据
               String content = EntityUtils.toString(response.getEntity(), "UTF-8");
               System.out.println(content);
           }
       } finally {
           if (response != null) {
               response.close();
           }
           httpclient.close();
       }
   }
}

1.3.3、 发起POST请求

/*
* 演示:使用HttpClient发起POST请求
*/
public class DoPOST {
   public static void main(String[] args) throws Exception {
       // 创建Httpclient对象
       CloseableHttpClient httpclient = HttpClients.createDefault();
       // 创建http POST请求
       HttpPost httpPost = new HttpPost("http://www.oschina.net/");
       // 把自己伪装成浏览器。否则开源中国会拦截访问
       httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");

       CloseableHttpResponse response = null;
       try {
           // 执行请求
           response = httpclient.execute(httpPost);
           // 判断返回状态是否为200
           if (response.getStatusLine().getStatusCode() == 200) {
               // 解析响应数据
               String content = EntityUtils.toString(response.getEntity(), "UTF-8");
               System.out.println(content);
           }
       } finally {
           if (response != null) {
               response.close();
           }
           // 关闭浏览器
           httpclient.close();
       }

   }
}

1.3.4、 带参数POST请求

/*
* 演示:使用HttpClient发起带有参数的POST请求
*/
public class DoPOSTParam {

   public static void main(String[] args) throws Exception {
       // 创建Httpclient对象
       CloseableHttpClient httpclient = HttpClients.createDefault();
       // 创建http POST请求,访问开源中国
       HttpPost httpPost = new HttpPost("http://www.oschina.net/search");

       // 根据开源中国的请求需要,设置post请求参数
       List<NameValuePair> parameters = new ArrayList<NameValuePair>(0);
       parameters.add(new BasicNameValuePair("scope", "project"));
       parameters.add(new BasicNameValuePair("q", "java"));
       parameters.add(new BasicNameValuePair("fromerr", "8bDnUWwC"));
       // 构造一个form表单式的实体
       UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters);
       // 将请求实体设置到httpPost对象中
       httpPost.setEntity(formEntity);

       CloseableHttpResponse response = null;
       try {
           // 执行请求
           response = httpclient.execute(httpPost);
           // 判断返回状态是否为200
           if (response.getStatusLine().getStatusCode() == 200) {
               // 解析响应体
               String content = EntityUtils.toString(response.getEntity(), "UTF-8");
               System.out.println(content);
           }
       } finally {
           if (response != null) {
               response.close();
           }
           // 关闭浏览器
           httpclient.close();
       }
   }
}

二、项目整合HttpClient—与SpringBoot整合

SpringBoot官方并没有对HttpClient的启动器。所以我们需要自己完成配置,还好,我们刚才在测试案例中已经写过了。

不过,SpringBoot虽然没有提供启动器,但是却提供了一个对Restful服务进行调用的模板类:RestTemplate,底层可以使用HttpClient来实现。有了这个我们就无需自己定义APIService了。

1、导入maven坐标

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
</dependency>

2、在bos_management中创建HttpClientConfig类

在这里插入图片描述

2、在application.properties添加如下配置:

#The config for HttpClient 
http.maxTotal=300
http.defaultMaxPerRoute=50
http.connectTimeout=1000
http.connectionRequestTimeout=500
http.socketTimeout=5000
http.staleConnectionCheckEnabled=true

3、在类中编写代码

/**
 * HttpClient的配置类
 */
@Configuration
@ConfigurationProperties(prefix = "http", ignoreUnknownFields = true)
public class HttpClientConfig {

    private Integer maxTotal;// 最大连接

    private Integer defaultMaxPerRoute;// 每个host的最大连接

    private Integer connectTimeout;// 连接超时时间

    private Integer connectionRequestTimeout;// 请求超时时间

    private Integer socketTimeout;// 响应超时时间

    /**
     * HttpClient连接池
     * @return
     */
    @Bean
    public HttpClientConnectionManager httpClientConnectionManager() {
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        connectionManager.setMaxTotal(maxTotal);
        connectionManager.setDefaultMaxPerRoute(defaultMaxPerRoute);
        return connectionManager;
    }

    /**
     * 注册RequestConfig
     * @return
     */
    @Bean
    public RequestConfig requestConfig() {
        return RequestConfig.custom().setConnectTimeout(connectTimeout)
            .setConnectionRequestTimeout(connectionRequestTimeout).setSocketTimeout(socketTimeout)
            .build();
    }

    /**
     * 注册HttpClient
     * @param manager
     * @param config
     * @return
     */
    @Bean
    public HttpClient httpClient(HttpClientConnectionManager manager, RequestConfig config) {
        return HttpClientBuilder.create().setConnectionManager(manager).setDefaultRequestConfig(config)
            .build();
    }

    @Bean
    public ClientHttpRequestFactory requestFactory(HttpClient httpClient) {
        return new HttpComponentsClientHttpRequestFactory(httpClient);
    }
    /**
     * 使用HttpClient来初始化一个RestTemplate
     * @param requestFactory
     * @return
     */
    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory requestFactory) {
        RestTemplate template = new RestTemplate(requestFactory);

        List<HttpMessageConverter<?>> list = template.getMessageConverters();
        for (HttpMessageConverter<?> mc : list) {
            if (mc instanceof StringHttpMessageConverter) {
                ((StringHttpMessageConverter) mc).setDefaultCharset(Charset.forName("UTF-8"));
            }
        }
        return template;
    }

    public Integer getMaxTotal() {
        return maxTotal;
    }

    public void setMaxTotal(Integer maxTotal) {
        this.maxTotal = maxTotal;
    }

    public Integer getDefaultMaxPerRoute() {
        return defaultMaxPerRoute;
    }

    public void setDefaultMaxPerRoute(Integer defaultMaxPerRoute) {
        this.defaultMaxPerRoute = defaultMaxPerRoute;
    }

    public Integer getConnectTimeout() {
        return connectTimeout;
    }

    public void setConnectTimeout(Integer connectTimeout) {
        this.connectTimeout = connectTimeout;
    }

    public Integer getConnectionRequestTimeout() {
        return connectionRequestTimeout;
    }

    public void setConnectionRequestTimeout(Integer connectionRequestTimeout) {
        this.connectionRequestTimeout = connectionRequestTimeout;
    }

    public Integer getSocketTimeout() {
        return socketTimeout;
    }

    public void setSocketTimeout(Integer socketTimeout) {
        this.socketTimeout = socketTimeout;
    }
}
展开阅读全文

Git 实用技巧

11-24
这几年越来越多的开发团队使用了Git,掌握Git的使用已经越来越重要,已经是一个开发者必备的一项技能;但很多人在刚开始学习Git的时候会遇到很多疑问,比如之前使用过SVN的开发者想不通Git提交代码为什么需要先commit然后再去push,而不是一条命令一次性搞定; 更多的开发者对Git已经入门,不过在遇到一些代码冲突、需要恢复Git代码时候就不知所措,这个时候哪些对 Git掌握得比较好的少数人,就像团队中的神一样,在队友遇到 Git 相关的问题的时候用各种流利的操作来帮助队友于水火。 我去年刚加入新团队,发现一些同事对Git的常规操作没太大问题,但对Git的理解还是比较生疏,比如说分支和分支之间的关联关系、合并代码时候的冲突解决、提交代码前未拉取新代码导致冲突问题的处理等,我在协助处理这些问题的时候也记录各种问题的解决办法,希望整理后通过教程帮助到更多对Git操作进阶的开发者。 本期教程学习方法分为“掌握基础——稳步进阶——熟悉协作”三个层次。从掌握基础的 Git的推送和拉取开始,以案例进行演示,分析每一个步骤的操作方式和原理,从理解Git 工具的操作到学会代码存储结构、演示不同场景下Git遇到问题的不同处理方案。循序渐进让同学们掌握Git工具在团队协作中的整体协作流程。 在教程中会通过大量案例进行分析,案例会模拟在工作中遇到的问题,从最基础的代码提交和拉取、代码冲突解决、代码仓库的数据维护、Git服务端搭建等。为了让同学们容易理解,对Git简单易懂,文章中详细记录了详细的操作步骤,提供大量演示截图和解析。在教程的最后部分,会从提升团队整体效率的角度对Git工具进行讲解,包括规范操作、Gitlab的搭建、钩子事件的应用等。 为了让同学们可以利用碎片化时间来灵活学习,在教程文章中大程度降低了上下文的依赖,让大家可以在工作之余进行学习与实战,并同时掌握里面涉及的Git不常见操作的相关知识,理解Git工具在工作遇到的问题解决思路和方法,相信一定会对大家的前端技能进阶大有帮助。
©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值