Nitro's

May 19, 2019 - Comments - tech

Retrofit、Volley、HttpClient比较

Retrofit作为现在大家用的最多HTTP请求框架,非常流行,Github上star 3w+。它为什么能超越Volley、HTTPClient能够一枝独秀呢?那先看看其他两个HTTP栈的实现。

HTTPClient

Java界老牌HTTP栈实现,由Apache维护,它支持HTTP1.0/1.1、极其丰富的API来支持各种子协议,代码庞大臃肿也变成了它的缺点,虽然它的创建一开始是为了弥补Java SDK中java.net包HTTP请求的简单实现,Android在6.0以后彻底弃用了它,转而推荐使用HTTPURLConnection。

Volley

作为Google官方开源的一款HTTP栈,它支持切换HTTPURLConnection、HTTPClient底层协议栈的切换,同时提供了请求线程池、缓存的支持,刚一推出也是收获许多赞赏,但是它就像G家好多产品一样,几年一次的维护和有些bug都需要使用方去维护解决,都是开发者逐渐抛弃的原因。虽然从Volley开始,这些HTTP栈的实现都在逐渐向上层实现,因为不管是Android、iOS大部分App的网络交互都是Restful-API的实现,所以能在提供基础HTTP服务的基础上,提供请求内容的封装、响应内容的解析就越来越迫切,Volley在这方便做出了第一步,响应内容的解析以及支持自定义解析这些功能。但是Volley的致命问题在于它的响应内容处理上,必须将全部数据读取出来交给上层数据,这对内存的要求可能很高,缺乏一定的灵活性,所以只适合小数据量的HTTP请求。

Retrofit

来自Android界开源大厂Square.Inc ,底层HTTP栈来自于OKHTTP框架,它支持HTTP 1.1/2,支持TLS,HTTP2作为socket连接复用的最新技术,OKHTTP的支持可以说是一大重点,因为作为移动端App,相比浏览器中的Web开发,App端点的可控性可以让我们快速支持这种技术来提高加载速度,同时OKHTTP提供了请求拦截器方便我们在请求发起前的对参数进行操纵。

  • Retrofit建立在OKHTTP的基石之上,抽象出了Converter、CallAdapter这两个重要的概念。

  • Coverter作为HTTP请求、响应内容的类型服务类为上层不同的技术实现提供支持,现在支持GSON、Guava、JSON、XML、Protobuf,同样你可以根据自己的需求进行定制。

  • CallAdapter则为不同的上层框架提供了容器支持,让你能够在Retrofit的基础上同步、异步的分发请求与响应,现在支持Java8、RxJava、RxJava2的标准实现。

  • 除此之外,动态代理、注解编程的使用,让开发者从复杂的请求参数、URL拼接中解放出来,更多的去关心业务逻辑的实现。

这一系列的优势让Retrofit逐渐得到开发者的青睐。

番外:

在Java11 OpenJDK的文档中看到另外一个HTTPClient的实现,支持HTTP2、支持上层RxJava编程,但这对于Android平台来说JDK 11还是有点远。

参考资料:

OKHTTP

JDK Httpclient