为什么我们有OkHttp,还要使用Retrofit呢?

163

使用OkHttp,我们可以发起HTTP请求并从服务器获取响应:

OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
   .url(url)
   .build();
Response response = client.newCall(request).execute();

然后使用Gson库将响应转换为所需的对象。

这是来自Square/OkHttp文档:

它的请求/响应API采用流畅的构建器和不可变性设计。它支持同步阻塞调用和带有回调的异步调用。

我从Stackoverflow上读到:

Retrofit会自动使用OkHTTP。

所以我的问题是:

  1. 什么是Retrofit?
  2. Retrofit可以做到OkHttp做不到的吗?

我认为OkHttp和Gson解决了请求API的问题,但是Retrofit为我们解决了什么问题呢?


2
基于观点的内容通常会被视为主观,因此可能会被关闭。事实是,两者都存在且没有消失。这意味着在Android开发者社区中,两者都有有效的使用案例。 - fge
1
请查看此帖子https://dev59.com/JWQn5IYBdhLWcg3wW2D3 - ivan.sim
@isim 我之前看过这个链接,但我不明白为什么需要Retrofit?!而且为什么Retrofit使用OkHttp! - Mehrdad Faraji
@MehrdadFaraji 如果OkHttp可以满足您的需求,那么您就不需要使用Retrofit。为什么Retrofit要使用OkHttp呢?因为它可以启用一些功能,例如OkHttp的“Call”模式、拦截器、证书固定等。 - ivan.sim
5个回答

134
使用OkHttp可以向服务器发送HTTP请求,然后获得响应...然后使用Gson库将响应转换为我们需要的对象。请注意,在您的代码片段中,您跳过了两个值得注意的步骤:生成URL和实际使用Gson解析JSON。
那么我的问题是Retrofit到底是用来做什么的?它用于生成URL(使用与特定REST API相关联的类型感知生成的代码),并使用Gson实际解析JSON。换句话说,它执行您在代码片段中跳过的操作。此外,对于某些类型的REST操作(例如POST),它有助于组装要提交的内容(例如生成编码表单)。
根据定义,您不需要使用Retrofit。Retrofit是计算机程序员编写的计算机代码。其他人可以编写代码来执行Retrofit所做的工作。
为什么Retrofit使用OkHttp?Retrofit需要执行HTTP操作。它在可用的情况下使用OkHttp,因为OkHttp提供了HTTP/2和SPDY支持、可插拔拦截器等所有功能。

43

Retrofit vs. OkHttp 原因很简单:OkHttp是一个纯HTTP/SPDY客户端,负责低层网络操作、缓存、请求和响应处理等。相比之下,Retrofit是基于OkHttp构建的高级REST抽象层。Retrofit 2与OkHttp紧密耦合,并广泛使用它。

OkHttp功能:连接池、gzip压缩、缓存、从网络问题中恢复、同步和异步调用、重定向、重试等等。

Retrofit功能:URL操作、请求、加载、缓存、线程、同步和异步调用。它允许同步和异步调用。


42
如果您想将服务器API映射到应用程序中(类型安全),那么您应该使用Retrofit,它只是包装在okHTTP上的API适配器。如果要类型安全且模块化地与API交互,请使用Retrofit。除此之外,okHTTP和Retrofit的基础性能、请求默认值等都是相同的。此外,我建议收听Jesse Wilson(主要Android HTTP客户端的开发人员)的这个播客,其中他深入讨论了Apache HTTP客户端、HTTPURLConnection、okHTTP和Retrofit的开发历史。

2
Retrofit基本上是在OKHTTP之上的架构,它内部使用OkHttp来进行任何请求。在Java中,如果我们想要发出任何请求,以前需要使用HTTPUrl连接或HTTPS Url连接,现在Retrofit OkHttp为我们处理一切(它将其分成包并标记头信息),如果我们需要发送一些信息。
Retrofit是基于restful原则的rest客户端。
- OkHttp是一个HTTP客户端,支持HTTP/2和SPDY。
- Retrofit是一种类型安全的Android和Java HTTP客户端。
- OkHttp依赖于Okio。
- Retrofit依赖于OkHttp,
因此,Retrofit基本上是OKHTTP的包装器,当需要时使用它,并且可以轻松管理连接超时和读取超时,只需使用其方法并添加拦截器。
希望我回答了你的问题!祝编码愉快!
有关更多信息,请参阅https://square.github.io/retrofit

0
OkHttp: 一个开源的HTTP客户端。HTTP是现代应用程序网络的方式。这是我们交换数据和媒体的方式。高效地处理HTTP可以使你的东西加载更快并节省带宽; Retrofit:Android和Java的类型安全HTTP客户端。Retrofit将您的HTTP API转换为Java接口。
OkHttp和Retrofit主要可以被归类为“API”工具。
一些OkHttp提供的特点包括: • HTTP/2支持允许所有请求共享套接字到同一主机。 • 连接池减少了请求的延迟(如果没有HTTP/2)。 • 透明的GZIP可以缩小下载大小。
另一方面,Retrofit提供以下关键功能: • URL参数替换和查询参数支持 • 对象转换为请求体(例如JSON,协议缓冲区) • 多部分请求体和文件上传

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接