如果Retrofit已在内部使用OkHttp,为什么开发人员将OkHttp设置为Retrofit

时间:2017-08-30 12:58:09

标签: android retrofit2 okhttp

我知道,Retrofit内部使用OkHttp。 但是,我可以看到一些开发人员提供了如下方法的应用

return new Retrofit.Builder()
        .baseUrl(BuildConfig.API_ENDPOINT)
        .client(getClient()) // we can add OkHttpClient client there

那么,有人可以澄清为什么需要它吗?

我听说当我们可以在模拟HTTP请求期间应用自定义拦截器时,这对测试有帮助

3 个答案:

答案 0 :(得分:6)

Retrofit会自行获取OkHttp的实例,但不会对OkHttpClient执行任何自定义。在很多情况下,您可能需要自定义客户端以利用OkHttp的灵活性。看看你能做些什么in this JavaDoc。您可以看到,您可以执行很多操作,例如设置自己的超时,自己的DNS,自己的自定义缓存(可能在图形密集型应用程序中派上用场),您自己的代理,基于用户设备限制协议(一个国家可能阻止HTTPS,以便您能够在这种情况下尽快回退到HTTP)等等。

编辑: 在大多数使用情况下,可能不需要这样,例如在对REST API端点的简单API调用中。但在某些情况下,例如视频流,VPN或代理服务,或任何需要您将应用程序自定义到地理区域或不同网络连接的情况,您都可以从中受益。我想到的其他一些示例是某些国家/地区阻止的某些消息或社交应用。甚至像Spotify或YouTube这样的应用程序。当用户通过WiFi连接时,您希望通过高速协议(例如UDP)将它们路由到高速服务器。但是,如果用户通过3G连接,您希望将它们路由到不同的服务器并使用TCP协议来确保质量。

答案 1 :(得分:4)

您应该向OkHttp明确提供Retrofit个实例,否则Retrofit会隐式执行.client(new OkHttpClient()),因此您不会获得大量聪明的东西,例如磁盘缓存,连接池。

了解杰克沃顿如何在"Making Retrofit Work For You" talk澄清案例。

修改

如果你有多个改造实例,上面提到的情况就有意义了。

答案 2 :(得分:0)

除了描述的答案之外,我还想提供一个例子。 在测试网络请求时,应用自定义OkHttp非常有用。

您可以制作两个OkHttpClient客户端。 一种是产品风味,另一种是模拟风味。

用于prod味道的OkHttpClient应该按预期工作。 OkHttpClient for mock flavor应该使用自定义Interceptor。 此自定义拦截器可用于分析对服务器的请求以及应用资源文件夹中的预定义响应。 这是模拟使用服务器的非常优雅的方式。