七大主流的HttpClient程序比较
HttpClient
?HttpClient,是一款强大的支持HTTP协议的客户端编程工具包。主要功能在于提供一种有效、最新且功能丰富的方式来执行HTTP请求和响应。HttpClient与浏览器有着本质的区别,它并不会缓存内容,也不会处理嵌入在HTML页面中的代码或是错误输入,更不会对不符合HTTP标准的行为进行处理。
?此外,HttpClient还支持多种HTTP协议的方法,包括但不限于GET、POST、PUT以及HEAD等。同时,它还具备对HTTPS和代理服务器的支持。这使得HttpClient成为了目前Internet上使用最为广泛且重要的协议之一。
优点 | 缺点 | |
---|---|---|
HttpURLConnection | jdk自带、原始、简单 | 无连接池、性能与效率相对较低、高级功能不方便使用,一般来说不建议使用。 |
java.net.http.HttpClient | jdk11正式启用自带HttpClient,代替之前比较旧的HttpURLConnection | Oracle收购后大多数企业使用的都还是jdk8,使用的可能性比较小 |
HttpClient | 1.支持连接池、多线程 2.从官方demo可以看出httpClient只创建一次,被多个线程复用 3.httpClient4.3后超时配置到request级 | 1.由于社区活跃度的问题,Android已经去掉了HttpClient该用了okHttp 2.使用起来需要自己封装 3.需要手动关闭httpclient.close() |
okHttp | 1.性能方面与httpclient类似 2.不需要手动关闭 3.支持http2 4.Android4.4开始换成okHttp | 1.使用时需要自己封装 2.new OkHttpClient()每次使用都需要new出来(从晚上看到说作者可能是考虑可以忽略此开销) 3.超时配置在client级,没到每个request,这个可能与第2点同原因 4.好像底层实现了多线程的支持,没深入研究 |
Retrofit | Retrofit是Square出的基于OKHttp封装的一套RESTful网络请求框架 1.restfull风格 2.基于接口编程 3.分装度高,基于注解 4.无须手动关闭 | 1.与okHttp类似,new Retorfit.Builder()每次使用都要new出来(可以考虑自己实现单例,网上也有些demo) |
RestTemplate | RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率 | 1.RestTemplate只有初始化配置,没有连接池 2.RestTemplate默认的http是HttpURLConnection |
openFeign | 1.可插拔的注解支持,包括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.java
PoolingHttpClientConnectionManager 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。
小舟从此逝,江海寄余生. ???--苏轼《临江仙》
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!