七大主流的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。

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

你可能感兴趣的:(Java,java,http)