HttpUtils工具类(一)常见的HttpUtils工具类及如何自定义java的http连接池

server/2024/9/24 8:41:41/

目录

一、几种常见的Http调用方式

1. 使用 Apache HttpClient

httpClient-toc" style="margin-left:40px;">2. 使用 OKhttpClient

http%E9%93%BE%E6%8E%A5%E6%B1%A0-toc" style="margin-left:40px;">3. 使用第三方库(Hutool)的http链接池

4. 使用 Spring RestTemplate

5. 使用 Java 原生的HttpURLConnection

二、总结

常用三种HttpUtils对比总结


一、几种常见的Http调用方式

  1. Apache HttpClient
  2. OKhttpClient
  3. Hutool封装的HttpUtils
  4. Spring RestTemplate
  5. Java 原生的HttpURLConnection

1. 使用 Apache HttpClient

Apache HttpClient 是一个功能强大的 HTTP 客户端库,支持同步和异步请求。它适用于处理更加复杂的场景,如认证、连接池、多线程、上传文件等。

特点

  • 功能强大:Apache HttpClient 是一个久经考验的库,支持多种复杂的场景,包括连接池、代理、认证、重定向、Cookie 管理等。
  • 扩展性好:可以通过丰富的 API 进行灵活配置,满足复杂的企业级应用需求。
  • 同步阻塞:Apache HttpClient 默认是同步阻塞模式,适用于同步请求。

优点

  • 成熟稳定,经过长时间的验证,企业级项目中广泛使用。
  • 适合需要复杂 HTTP 操作的场景,如带有重试、认证和状态维护的请求。

缺点

  • 比较重量级,学习曲线稍陡峭。

maven依赖:

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

httpClient">2. 使用 OKhttpClient

官网(概述 - OkHttp (square.github.io))

OKhttpClient是一个轻量级且性能出色的 HTTP 客户端,支持同步和异步请求,广泛应用于 Android 开发中。

特点

  • 轻量级且高效:OkHttpClient 是由 Square 开发的轻量级 HTTP 客户端库,广泛用于 Android 开发中。
  • 同步与异步请求:支持同步阻塞和异步非阻塞请求,异步操作非常简单且性能良好。
  • 连接复用:内置连接池,减少重复连接带来的开销,尤其适合在 Android 和 Web 应用中使用。

优点

  • 性能优异,尤其适合移动端和需要高并发的场景。
  • API 简单易用,支持异步调用,非常适合需要频繁发起网络请求的应用场景。

缺点

  • 功能相对较少,某些复杂功能需要自定义扩展。

maven依赖:

<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.9.0</version>
</dependency>

http%E9%93%BE%E6%8E%A5%E6%B1%A0">3. 使用第三方库(Hutool)的http链接池

官网(Http客户端工具类-HttpUtil (hutool.cn)

Hutool-http针对JDK的HttpUrlConnection做一层封装,简化了HTTPS请求、文件上传、Cookie记忆等操作,使Http请求变得无比简单。

Hutool-http的核心集中在两个类:

  • HttpRequest
  • HttpResponse

同时针对大部分情境,封装了HttpUtil工具类。

优点:

  1. 根据URL自动判断是请求HTTP还是HTTPS,不需要单独写多余的代码。
  2. 表单数据中有File对象时自动转为multipart/form-data表单,不必单做做操作。
  3. 默认情况下Cookie自动记录,比如可以实现模拟登录,即第一次访问登录URL后后续请求就是登录状态。
  4. 自动识别304跳转并二次请求
  5. 自动识别页面编码,即根据header信息或者页面中的相关标签信息自动识别编码,最大可能避免乱码。
  6. 自动识别并解压Gzip格式返回内容

特点

  • 工具化封装:Hutool 是一个 Java 工具库,其封装的 HttpUtils 提供了简洁的 API,用于发送 HTTP 请求。与 Apache HttpClient 和 OkHttp 相比,Hutool 封装的 HttpUtils 更加简化和易用,适合快速开发。
  • 轻量级:Hutool 的封装非常轻量,主要面向日常开发中的小型任务。
  • 默认处理:支持自动化处理请求头、超时、编码等,开发者只需关注核心业务逻辑。

优点

  • API 简单易用,能快速上手,适合需要快速开发和简洁代码的项目。
  • Hutool 提供了丰富的其他工具类,整合使用可以大大提升开发效率。

缺点

  • 不适合处理过于复杂的 HTTP 场景,定制化能力弱于 Apache HttpClient 和 OkHttp。
  • 适用于一般场景下的快速开发,复杂场景可能需要自行扩展或使用其他库。

maven依赖:

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version>
</dependency>

4. 使用 Spring RestTemplate

RestTemplate 是 Spring 提供的用于调用 RESTful Web 服务的工具类,简化了发送 HTTP 请求和处理响应的操作。

5. 使用 Java 原生的HttpURLConnection

HttpURLConnection 是 Java 自带的用于发送 HTTP 请求的类。它适合处理简单的 GET、POST 请求,但对于更复杂的需求(如多部分表单数据上传、流式处理等),需要自己编写更多的代码

二、总结

  • 简单场景HttpURLConnectionRestTemplate、Hutools的HttpUtils
  • 复杂场景Apache HttpClientOkHttpClient,用于处理认证、连接池、文件上传等定制化需求。

常用三种HttpUtils对比总结

  • Apache HttpClient:适用于复杂的企业级应用,功能齐全,特别是在处理高级 HTTP 功能如认证、代理、连接池等方面表现出色。
  • OkHttpClient:轻量级且高效,适合高并发、移动端应用(如 Android 开发)以及需要异步请求的场景,性能好且使用简单。
  • Hutool 封装的 HttpUtils:工具类封装简洁,适合快速开发和处理简单的 HTTP 请求,适合轻量级项目。

可以根据项目需求选择合适的工具可以有效简化 HTTP 请求的处理逻辑。

=======================================================

 接下来,将围绕

  1. Apache HttpClient
  2. OKhttpClient

这两种自定义Http连接池,并列举相应的例子。


http://www.ppmy.cn/server/102829.html

相关文章

MySQL的子查询

1. 子查询的基本概念 子查询是嵌套在主查询中的查询语句。主查询使用子查询的结果作为条件、过滤器或计算的一部分。子查询可以嵌套在SELECT、FROM、WHERE、HAVING和INSERT语句中。 2. 子查询的使用方法 以下是子查询在不同查询语句中的使用方法&#xff1a; 子查询作为条件…

创建干净虚拟环境对YOLOV8进行打包

背景 基于Yolov8写了一个视频检测小demo&#xff0c;考虑后续要到项目上使用&#xff0c;所以研究了一下打包流程。使用的工具是Pyinstaller&#xff0c;在原有的环境下面打包发现&#xff0c;大小有6个多G。所以想再弄一个干净的环境&#xff0c;只安装需要的模块&#xff0c…

基于web框架的协同过滤的美食推荐系统【数据爬虫、管理系统、数据可更新、样式可调整】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍研究背景研究的目的与意义协同过滤算法基于用户的协同过滤算法定义基于物品的协同过滤算法的定义 数据库设计db_food&#xff08;美食信息表&#xff09;db_collect&#xff08;美食…

微服务设计原则——高性能:池化

文章目录 1.池化由来2.内存池3.线程池4.连接池5.对象池6.小结参考文献 1.池化由来 池化&#xff08;Pooling&#xff09;是一种优化技术&#xff0c;旨在提高系统性能和资源利用率&#xff0c;特别是在高并发环境中。通过池化&#xff0c;系统可以重用资源&#xff0c;而不是每…

java并发编程之线程基础

文章目录 线程基础线程状态New&#xff08;新创建&#xff09;Runnable&#xff08;可运行&#xff09;被阻塞线程和等待线程Terminated&#xff08;终止&#xff09; 三种使用线程的方法线程互斥同步Synchronized概念修饰的四种对象 ReentrantLock比较 线程基础 线程状态 线…

网络编程/在哪些场景中不必要进行网络字节序转换? Windows Sockets: Byte Ordering

文章目录 概述字节序必须转换字节序的的情况不必转换字节序的的情况字节序转换的例程字节序转换函数字节序转换可以不生硬字节序和位序 概述 本文主要讲述了在哪些场景下必须要进行大小端字节序转换&#xff0c;在哪些场景下可以不用进行大小端字节序转换&#xff0c;IP和端口…

【ubuntu24.04】k8s 部署6:calico容器正常启动

参考大神 以及 tigera官方的calico 教程:拥有一个带有 Calico 的单主机 Kubernetes 集群 后, 【k8s】配置calico 1: 镜像拉取 【k8s】master节点重新安装docker-ce 本文进一步解决容器启动问题: 非常感谢大神的指点:准备 Kubernetes 集群环境 做好了各种配置以后,kube**的…

encoding with ‘idna‘ codec failed (UnicodeError: label empty or too long)

今天在使用Flask连接mysql的时候&#xff0c;遇到了一个报错&#xff1a;encoding with ‘idna’ codec failed (UnicodeError: label empty or too long) 网上查了一下说是字符集的问题&#xff0c;然后尝试修改了一下字符集&#xff0c;结果还是不行。 最后去翻阅SQLAlchemy…