当我们有 OkHttp 时为啥要使用 Retrofit

Posted

技术标签:

【中文标题】当我们有 OkHttp 时为啥要使用 Retrofit【英文标题】:why use Retrofit when we have OkHttp当我们有 OkHttp 时为什么要使用 Retrofit 【发布时间】:2017-01-04 03:06:47 【问题描述】:

使用 OkHttp 我们可以发出 HTTP 请求然后从服务器获取响应

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

然后使用 Gson lib 将响应转换为我们需要的对象。

这是来自 Square/OkHttp 文档:

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

我从***读到

如果可用,Retrofit 会自动使用 OkHTTP

.

所以我的问题是改造到底是为了什么?

OkHttp 做不到的 Retrofit 能做什么?!

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

【问题讨论】:

基于意见,因此可能会被关闭。事实是,两者都存在,没有人死去。这意味着在 android 开发者社区的眼中,两者都有有效的用例。 查看这篇文章***.com/q/16902716/1144203 @isim 我以前看过这个链接,但我不明白为什么需要Retrofit?!以及为什么 Retrofit 使用 OkHttp! @MehrdadFaraji 如果 OkHttp 可以做你想做的事,你就不需要改造。 为什么 Retrofit 使用 OkHttp 比如启用 OkHttp Call 模式、OkHttp 拦截器、证书固定等。 【参考方案1】:

使用 OkHttp 我们可以发出 HTTP 请求然后从服务器获取响应...然后使用 Gson lib 将响应转换为我们需要的对象

请注意,在您的代码 sn-p 中,您跳过了两个值得注意的步骤:生成 URL 和使用 Gson 实际解析 JSON。

所以我的问题是改造到底是为了什么?

它用于生成 URL(使用与特定 REST API 相关的类型感知生成代码)并使用 Gson 实际解析 JSON。换句话说,它会执行您在代码 sn-p 中跳过的操作。

此外,对于某些类型的 REST 操作(例如,POST),它有助于组装要提交的内容(例如,生成编码表单)。

根据定义,您不需要使用 Retrofit。改造是计算机代码,由计算机程序员编写。其他人可以编写代码来做 Retrofit 所做的事情。

为什么 Retrofit 使用 OkHttp

Retrofit 需要执行 HTTP 操作。它在可用的情况下使用 OkHttp,因为 OkHttp 提供的所有功能:HTTP/2 和 SPDY 支持、可插入拦截器等。

【讨论】:

【参考方案2】:

如果您尝试在应用程序中映射服务器 API(类型安全),则应该使用改造。 Retrofit 只是一个封装在 okHTTP 上的 API 适配器。

如果您想使用 API 进行安全输入和模块化交互代码,请使用改造。除此之外,okHTTP 和 Retrofit 的底层性能、请求默认值等都是相同的。

我还建议收听​​ Jesse Wilson(主要 android HTTP 客户端的开发人员)的 this 播客,他在其中深入探讨了 Apache HTTP 客户端、HTTPURLConnection、okHTTP 和 Retrofit 的开发历史。

【讨论】:

【参考方案3】:

改造与 OkHttp 原因很简单:OkHttp 是一个纯 HTTP/SPDY 客户端,负责任何低级网络操作、缓存、请求和响应操作等等。相比之下,Retrofit 是建立在 OkHttp 之上的高级 REST 抽象。 Retrofit 2 与 OkHttp 强耦合并大量使用它。

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

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

【讨论】:

【参考方案4】:

Retrofit 基本上是 OKHTTP 之上的架构,它在内部使用 OkHttp 来发出任何请求,在 jave 早期,如果我们想要发出任何请求,我们有 HTTPUrl 连接或 HTTPS Url 连接知道改造 okHttp 处理一切(它分为它标记的包headers )如果我们需要发送一些信息给我们。

Retrofit是一个基于restful原则的rest客户端。

->OkHttp是一个HTTP客户端,支持HTTP/2和SPDY。

->Retrofit 是适用于 android 和 java 的类型安全 HTTP 客户端

->OkHttp 依赖于 Okio。

->改造依赖于OkHttP,

所以 Retrofit 基本上是 OKHTTP 的一个包装器,它在必要时使用,并且可以轻松管理连接超时和读取超时,只需使用它的方法,还添加了拦截器。

希望我回答!编码愉快!!!

更多信息请参考https://square.github.io/retrofit

【讨论】:

【参考方案5】:

OkHttp:一个开源的 HTTP 客户端。 HTTP 是现代应用程序网络的方式。这就是我们交换数据和媒体的方式。高效地执行 HTTP 可以让您的内容加载更快并节省带宽; Retrofit:适用于 Android 和 Java 的类型安全 HTTP 客户端。 Retrofit 将你的 HTTP API 变成一个 Java 接口。

OkHttp 和 Retrofit 可以主要归类为“API”工具。

OkHttp 提供的一些功能包括: • HTTP/2 支持允许对同一主机的所有请求共享一个套接字。 • 连接池减少了请求延迟(如果 HTTP/2 不可用)。 • 透明的 GZIP 缩小了下载大小。

另一方面,Retrofit 提供以下主要功能: • URL 参数替换和查询参数支持 • 对象转换为请求正文(例如,JSON、协议缓冲区) • 多部分请求正文和文件上传

【讨论】:

以上是关于当我们有 OkHttp 时为啥要使用 Retrofit的主要内容,如果未能解决你的问题,请参考以下文章

当我们有 UPnP 时为啥要拨号(发现和启动)?

当我们使用 Luhn 算法验证信用卡时,为啥要反转数字?

为啥当我解析我的响应 okHttp 时它不起作用

为啥要使用引用来获取 *char?当我们使用指针时不使用引用不是更好吗?

当我们有常规数组时,为啥我们需要指向数组的指针?

为啥 OkHttp 不重用它的连接?