当前位置: 首页 > news >正文

七大主流的HttpClient程序比较

HttpClient

 HttpClient,是一款强大的支持HTTP协议的客户端编程工具包。主要功能在于提供一种有效、最新且功能丰富的方式来执行HTTP请求和响应。HttpClient与浏览器有着本质的区别,它并不会缓存内容,也不会处理嵌入在HTML页面中的代码或是错误输入,更不会对不符合HTTP标准的行为进行处理。

 此外,HttpClient还支持多种HTTP协议的方法,包括但不限于GET、POST、PUT以及HEAD等。同时,它还具备对HTTPS和代理服务器的支持。这使得HttpClient成为了目前Internet上使用最为广泛且重要的协议之一。

优点缺点
HttpURLConnectionjdk自带、原始、简单无连接池、性能与效率相对较低、高级功能不方便使用,一般来说不建议使用。
java.net.http.HttpClientjdk11正式启用自带HttpClient,代替之前比较旧的HttpURLConnectionOracle收购后大多数企业使用的都还是jdk8,使用的可能性比较小
HttpClient1.支持连接池、多线程
2.从官方demo可以看出httpClient只创建一次,被多个线程复用
3.httpClient4.3后超时配置到request级
1.由于社区活跃度的问题,Android已经去掉了HttpClient该用了okHttp
2.使用起来需要自己封装
3.需要手动关闭httpclient.close()
okHttp1.性能方面与httpclient类似
2.不需要手动关闭
3.支持http2
4.Android4.4开始换成okHttp
1.使用时需要自己封装
2.new OkHttpClient()每次使用都需要new出来(从晚上看到说作者可能是考虑可以忽略此开销)
3.超时配置在client级,没到每个request,这个可能与第2点同原因
4.好像底层实现了多线程的支持,没深入研究
RetrofitRetrofit是Square出的基于OKHttp封装的一套RESTful网络请求框架
1.restfull风格
2.基于接口编程
3.分装度高,基于注解
4.无须手动关闭
1.与okHttp类似,new Retorfit.Builder()每次使用都要new出来(可以考虑自己实现单例,网上也有些demo)
RestTemplateRestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率1.RestTemplate只有初始化配置,没有连接池
2.RestTemplate默认的http是HttpURLConnection
openFeign1.可插拔的注解支持,包括Feign注解和JAX-RS注解
2.支持可插拔的HTTP编码器和解码器(Gson,Jackson,Sax,JAXB,JAX-RS,SOAP)
3.支持HTTP请求和响应的压缩
4.支持多种客户端:JDK URLConnection、apache httpclient、okhttp、ribbon
默认的http是HttpURLConnection

1、HttpURLConnection

HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便,比如重访问的自定义,以及一些高级功能等。

2、java.net.http.HttpClient

jdk11正式启用自带HttpClient,代替之前比较旧的HttpURLConnection。其实从java9的jdk.incubator.httpclient模块迁移到java.net.http模块,包名由jdk.incubator.http改为java.net.http。

3、Apache HttpClient

在Android中,AndroidSDK中集成了Apache的HttpClient模块,HttpClient就是一个增强版的HttpURLConnection,它只是关注于如何发送请求、接收响应,以及管理HTTP连接。如果做好封装或者使用android-async-http,Afinal,Xutils也能挺简单的完成http请求,但是Android6.0谷歌因为和Apache更新难以同步等原因吧已经放弃了HttpClient,改于了okHttp。

  //httpclient官网示例 ClientMultiThreadedExecution.javaPoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();cm.setMaxTotal(100);CloseableHttpClient httpclient = HttpClients.custom().setConnectionManager(cm).build();.........} finally {httpclient.close();}//超时配置到Request级RequestConfig requestConfig = RequestConfig.copy(defaultRequestConfig).setSocketTimeout(5000).setConnectTimeout(5000).setConnectionRequestTimeout(5000).setProxy(new HttpHost("myotherproxy", 8080)).build();

4、okHttp

OkHttp 是 Square 公司开源的针对 Java 和 Android 程序,封装的一个高性能 http 请求库。OKHttp 类似于 HttpUrlConnection, 是基于传输层实现应用层协议的网络框架。 而不止是一个 Http 请求应用的库。

okHttp的优势:

  • 链接复用
  • Response 缓存和 Cookie
  • 默认 GZIP
  • 请求失败自动重连
  • DNS 扩展
  • Http2/SPDY/WebSocket 协议支持
  • 默认情况下,OKHttp会自动处理常见的网络问题:像二次连接、SSL的握手问题。
  • 从Android4.4开始HttpURLConnection的底层实现采用的是okHttp.

5、Retrofit

Retrofit 是 Square 公司出品的默认基于 OkHttp 封装的一套 RESTful 网络请求框架,,RESTful 可以说是目前流行的一套 api 设计的风格,并不是标准。Retrofit 的封装可以说是很强大,里面涉及到一堆的设计模式,你可以通过注解直接配置请求,你可以使用不同的 http 客户端,虽然默认是用 OKhttp ,可以使用不同 Json Converter 来序列化数据,同时提供对 RxJava 的支持,使用 Retrofit + OkHttp + RxJava + Dagger2 可以说是目前比较 的一套框架,但是需要有比较高的门槛。

Retrofit retrofit =new Retrofit.Builder().baseUrl(API_URL).addConverterFactory(GsonConverterFactory.create()).build();

6、RestTemplate

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

7、OpenFeign

  • 可插拔的注解支持,包括Feign注解和JAX-RS注解。
  • 支持可插拔的HTTP编码器和解码器(Gson,Jackson,Sax,JAXB,JAX-RS,SOAP)。
  • 支持Hystrix和它的Fallback。
  • 支持Ribbon的负载均衡。
  • 支持HTTP请求和响应的压缩。
  • 灵活的配置:基于 name 粒度进行配置
  • 支持多种客户端:JDK URLConnection、apache httpclient、okhttp,ribbon)
  • 支持日志
  • 支持错误重试
  • url支持占位符
  • 可以不依赖注册中心独立运行

总结

  • 在你还在纠结选择apache httpclient时,Android已经不用它了,改用okhttp了
  • 当你还在纠结选择apache httpclient还是okhttp时,Square已经出了Retrofit,网友已经在说既然你都用了okhttp为何不直接使用Retrofit

总的来说技术变化更新都比较快,得跟上技术的发展。一般来说没有使用springcloud话可以选择Retrofit,如果使用了springcloud可以使用OpenFeign+okHttp。

小舟从此逝,江海寄余生.    --苏轼《临江仙》

相关文章:

  • 国内外网络安全现状与存在的问题。应该如何缓解或解决这些问题
  • 51单片机应用从零开始(十一)·数组函数、指针函数
  • 龙芯loongarch64服务器编译安装gcc-8.3.0
  • 虚拟化之问答
  • html css概念
  • 【极客公园 IF 2024】李彦宏:AI-native时代,需要怎样的产品和开发者
  • 【JavaSE】Java入门九(异常详解)
  • 带你手把手解读rejail沙盒源码(0.9.72版本) (七) fnetfilter
  • 将 OpenLDAP 与 IBM Spectrum LSF 集成
  • 工业数据的特殊性和安全防护体系探索思考
  • 数据结构--图
  • VuePress安装及使用——使用 Markdown 创建你自己的博客网站和电子书
  • 23.ACL
  • LINUX SD卡备份的镜像+烧录启动时自动扩展最后一个分区
  • 【数据结构】什么是堆?
  • Angular 4.x 动态创建组件
  • EventListener原理
  • Git的一些常用操作
  • HTTP中GET与POST的区别 99%的错误认识
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JavaScript设计模式系列一:工厂模式
  • Linux链接文件
  • maven工程打包jar以及java jar命令的classpath使用
  • React-Native - 收藏集 - 掘金
  • SpriteKit 技巧之添加背景图片
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 从伪并行的 Python 多线程说起
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 全栈开发——Linux
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 数据结构java版之冒泡排序及优化
  • 通过git安装npm私有模块
  • 无服务器化是企业 IT 架构的未来吗?
  • 小程序01:wepy框架整合iview webapp UI
  • 应用生命周期终极 DevOps 工具包
  • 7行Python代码的人脸识别
  • ​io --- 处理流的核心工具​
  • ​决定德拉瓦州地区版图的关键历史事件
  • (2)STL算法之元素计数
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (论文阅读30/100)Convolutional Pose Machines
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (三)elasticsearch 源码之启动流程分析
  • (四) 虚拟摄像头vivi体验
  • (循环依赖问题)学习spring的第九天
  • (转)ABI是什么
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET MVC之AOP
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .netcore 获取appsettings
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)