广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java HttpClient技术详解
  • 801
分享到

Java HttpClient技术详解

2024-04-02 19:04:59 801人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、HttpClient1.1、 前台系统访问后台接口的方式1.2、 什么是HttpClient1.3、 HttpClient入门案例1.3.1、 发起Get请求1.3.2、 带

一、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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java HttpClient技术详解

本文链接: https://www.lsjlt.com/news/137731.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Java HttpClient技术详解
    目录一、HttpClient1.1、 前台系统访问后台接口的方式1.2、 什么是HttpClient1.3、 HttpClient入门案例1.3.1、 发起Get请求1.3.2、 带...
    99+
    2022-11-12
  • Java WebService技术详解
    Java WebService技术是一种用于构建分布式应用程序的技术,它允许不同的应用程序通过网络进行通信和交互。Java WebS...
    99+
    2023-08-11
    java
  • Java原生HttpClient的使用详解
    目录1.信任证书管理类2.HttpClient类3.发送请求工具类4.测试提到Java发送HTTP请求,大家首先想到的是用apache的HttpClient,或者squareup的O...
    99+
    2022-11-13
  • Java反射技术详解
    目录前言一、基本反射技术1.1 根据一个字符串得到一个类getClass方法Class.forNameType属性二、获取类的成员获取类中特定的构造方法调用构造方法调用类的私有方法获...
    99+
    2022-11-12
  • android 的android httpClient详解
    Android HttpClient是Android平台提供的一个HTTP请求客户端,使用它可以方便地发送HTTP请求并获得请求的响...
    99+
    2023-09-21
    Android
  • android的android httpClient详解
    Android中的HttpClient是一个HTTP客户端库,用于发送HTTP请求和接收HTTP响应。它提供了一组类和接口,可以在A...
    99+
    2023-08-22
    android
  • Java SpringAOP技术之注解方式详解
    目录1.配置xml扫描注解 2.配置注解3.配置文件中开启自动代理4.通知类型注解5.测试类6.结果 总结1.配置xml扫描注解  <xml ve...
    99+
    2022-11-13
  • Java使用HttpClient详细示例
    目录准备环节第一步:在pom.xml中引入HttpClient的依赖第二步:引入fastjson依赖详细使用示例GET无参:GET有参(方式一:直接拼接URL):GET有参(方式二:...
    99+
    2022-11-12
  • HttpClient jar包使用详解
    HttpClient是一个开源的HTTP客户端工具包,用来进行HTTP通信。它可以用来发送HTTP请求和接收HTTP响应,支持HTT...
    99+
    2023-09-15
    HttpClient
  • Java Agent探针技术详解示例
    目录什么是java agent使用示例入门进阶(一款接口mock数据小插件)使用什么是java agent 在JVM中运行中,类是通过classLoader加载.class文件进行生...
    99+
    2022-11-13
  • 详解Java动态字节码技术
    目录对 Debug 的好奇ASM动态生成字节码ASM 框架常用方法InstrumentJVM TI介绍Agent使用agent生成代码实现被修改的类AgentAttacher小结对 ...
    99+
    2022-11-12
  • java 中HttpClient传输xml字符串实例详解
    java 中HttpClient传输xml字符串实例详解介绍:我现在有一个对象page,需要将page对象转换为xml格式并以binary方式传输到服务端其中涉及到的技术点有:对象转xml流2、输出流转输入流3、httpClient发送二进...
    99+
    2023-05-31
    httpclient xml ava
  • Java服务调用RestTemplate与HttpClient的使用详解
    目录概述RestTemplate概述及依赖配置类使用GET请求POST请求上传文件HttpClient概述使用概述 常见的远程调用方式有以下2种: RPC: Remote Produ...
    99+
    2022-11-13
  • ×××技术详解(3)
    九、数据传输阶段   一旦完成上述4阶段的协商,PPP就开始在连接对等双方之间转发数据。每个被传送的数据报都被封装在PPP包头内,该包头将会在到达接收方之后被去除。如果在阶段1选择使用数据压缩并且在阶段4完成了协商,数据将会在被传送之间进行...
    99+
    2023-01-31
    详解 技术
  • JavaWebService技术详解
    目录WebServiceWebService简介WebService原理JAVA WebService规范(1)JAX-WS:(2)JAXM&SAAJ:(3)JAX-RS:W...
    99+
    2022-11-12
  • HttpClient及有关jar包详解
    HttpClient是一个开源的Java HTTP客户端库,它主要用于发送HTTP请求和处理HTTP响应。它支持各种HTTP方法,如...
    99+
    2023-09-12
    HttpClient
  • Java绘图技术的详解及实例
    Java绘图技术的详解及实例简单实例public class Demo1 extends JFrame{ MyPanel mp=null; public static void main(String[] args){ Dem...
    99+
    2023-05-31
    java 绘图 ava
  • JDBC 技术详解1
    jdbc是数据库中十分重要的一项技术,是我们在做项目最常用的一类接口实现类, 这里就个朋友们简单详细的聊一下。 首先我们应该知道什么是jdbc JDBC(JavaDataBaseConnectivity)j...
    99+
    2022-10-18
  • 详解Java中的字节码增强技术
    目录1.字节码增强技术2.常见技术3.ASM3.1 测试 Main3.2 测试 CustomerClassVisitor3.3 测试 Test1.字节码增强技术 字节码增强技术就是一...
    99+
    2022-11-13
  • JDBC核心技术详解
    一、JDBC概述 1、数据的持久化 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作