我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java HttpClient技术详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java HttpClient技术详解

一、HttpClient

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

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

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

1.2、 什么是HttpClient

在这里插入图片描述

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

现在也叫:HttpComponents

在这里插入图片描述

特点:

  • HttpClient别名:HttpComponents
  • HttpClient可以发送get、post、put、delete、…等请求

1.3、 HttpClient入门案例

导入maven坐标


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

        // HttpGet get = new HttpGet("http://www.baidu.com/s?wd=java");
        
        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请求



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请求



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>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2、在项目中创建HttpClientConfig类–类似util

在这里插入图片描述

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


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

4、在类中编写代码



@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;// 响应超时时间

    
    @Bean
    public HttpClientConnectionManager httpClientConnectionManager() {
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        connectionManager.setMaxTotal(maxTotal);
        connectionManager.setDefaultMaxPerRoute(defaultMaxPerRoute);
        return connectionManager;
    }

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

    
    @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);
    }
    
    @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;
    }
}

三、RestTemplate使用详解

1、概述:

RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。

之前的HTTP开发是用apache的HttpClient开发,代码复杂,还得操心资源回收等。代码很复杂,冗余代码多。

导入坐标:


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2、创建RestTemplate对象

在这里插入图片描述

第一步:创建RestTemplate类,在类中创建RestTemplate对象



@Configuration//加上这个注解作用,可以被Spring扫描
public class RestTemplateConfig {
    
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }


}

第二步:创建RestTempController,注入RestTemplate



@RestController
@RequestMapping("/rest")
public class RestTempController {

    // 从Spring的容器中获取restTemplate
    @Autowired
    private RestTemplate restTemplate;
}    

3、get请求

第一步:在RestTempController中编写代码,发起get请求:



    @GetMapping
    public ResponseEntity<String> findByPage(){
        
        ResponseEntity<String> entity = restTemplate.getForEntity("http://localhost:8088/admin?page=1&rows=3", String.class);
        System.out.println("状态码:"+entity.getStatusCode());
        System.out.println("响应体"+entity.getBody());
        return ResponseEntity.ok(entity.getBody());
    }

测试结果:

在这里插入图片描述

4、post请求

第一步:创建实体类Admin


public class Admin {
    
    private Integer id;

    
    private String adminname;

    
    private String password;

    
    private String email;

    
    private String phone;

    
    private Integer state;

    
    private Date time;

    
    private String rid;
  	
    // 省略getter和setter方法
    
 }   

第二步:在RestTempController中编写方法,发送post请求


@PostMapping
    public ResponseEntity<String> addAdmin(@RequestBody Admin admin){
        
        ResponseEntity<String> entity = restTemplate.postForEntity("http://localhost:8088/admin", admin, String.class);
        return entity;

    }

第三步:采用postman测试

在这里插入图片描述

在这里插入图片描述

5、post请求的中文乱码bug

在RestTemplateConfig中编写处理乱码的问题:



@Configuration//加上这个注解作用,可以被Spring扫描
public class RestTemplateConfig {
    
    @Bean
    public RestTemplate restTemplate(){
        RestTemplate restTemplate = new RestTemplate();
        // 设置中文乱码问题方式一
        restTemplate.getMessageConverters().add(1,new StringHttpMessageConverter(Charset.forName("UTF-8")));
        // 设置中文乱码问题方式二
        //        restTemplate.getMessageConverters().set(1,
//                new StringHttpMessageConverter(StandardCharsets.UTF_8)); // 支持中文编码

        return restTemplate;
    }


}

6、put请求

第一步:在RestTempController中编写方法,发送put请求



    @PutMapping
    public ResponseEntity<String> updateAdmin(@RequestBody Admin admin){
        // 第一个参数:url
        // 第二个参数:对象,数据
        restTemplate.put("http://localhost:8088/admin",admin);
        return ResponseEntity.ok("修改成功");
    }

7、delete请求

第一步:在RestTempController中编写方法,发送delete请求


@DeleteMapping("/{id}")
    public ResponseEntity<String> deleteAdmin(@PathVariable("id") Integer id){
        restTemplate.delete("http://localhost:8088/admin/"+id);

        return ResponseEntity.ok("删除成功");
    }

到此这篇关于Java HttpClient技术详解的文章就介绍到这了,更多相关Java HttpClient内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java HttpClient技术详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java WebService技术详解

Java WebService技术是一种用于构建分布式应用程序的技术,它允许不同的应用程序通过网络进行通信和交互。Java WebService技术基于一组标准化的协议和规范,包括SOAP(Simple Object Access Prot
2023-08-11

android的android httpClient详解

Android中的HttpClient是一个HTTP客户端库,用于发送HTTP请求和接收HTTP响应。它提供了一组类和接口,可以在Android应用程序中进行网络通信。HttpClient的主要功能包括:1. 创建和管理HTTP连接:Htt
2023-08-22

android 的android httpClient详解

Android HttpClient是Android平台提供的一个HTTP请求客户端,使用它可以方便地发送HTTP请求并获得请求的响应。下面是Android HttpClient的详细解释:1. 创建HttpClient对象:```java
2023-09-21

java 中HttpClient传输xml字符串实例详解

java 中HttpClient传输xml字符串实例详解介绍:我现在有一个对象page,需要将page对象转换为xml格式并以binary方式传输到服务端其中涉及到的技术点有:1、对象转xml流2、输出流转输入流3、httpClient发送
2023-05-31

HttpClient jar包使用详解

HttpClient是一个开源的HTTP客户端工具包,用来进行HTTP通信。它可以用来发送HTTP请求和接收HTTP响应,支持HTTP/1.1和HTTP/2协议,并提供了许多高级功能,如重定向、代理、认证、cookie管理等。使用HttpC
2023-09-15

Java绘图技术的详解及实例

Java绘图技术的详解及实例简单实例public class Demo1 extends JFrame{ MyPanel mp=null; public static void main(String[] args){ Dem
2023-05-31

NAT技术详解

  NAT(NetworkAddressTranslation,网络地址转换)是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。这种方法需要在专用网连接到因特网的路由器上安装NAT软件。装有NA
NAT技术详解
2024-04-18

×××技术详解(3)

九、数据传输阶段  一旦完成上述4阶段的协商,PPP就开始在连接对等双方之间转发数据。每个被传送的数据报都被封装在PPP包头内,该包头将会在到达接收方之后被去除。如果在阶段1选择使用数据压缩并且在阶段4完成了协商,数据将会在被传送之间进行压
2023-01-31

HttpClient及有关jar包详解

HttpClient是一个开源的Java HTTP客户端库,它主要用于发送HTTP请求和处理HTTP响应。它支持各种HTTP方法,如GET、POST、PUT、DELETE等,并且可以处理HTTP请求和响应的各种特性,如请求头、请求体、响应头
2023-09-12

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录