okhttp3每次new

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了okhttp3每次new相关的知识,希望对你有一定的参考价值。

1. 简介
okhttp是我们在android开发中十分常用的一个网络请求框架。

2. 常用API总结
下面将介绍okhttp3中的一些常用的api(okhttp3完整文档如下,可自行参阅:https://square.github.io/okhttp/3.x/okhttp/)。

2.1 OkHttpClient
OkHttpClient可以理解为是一个构造Call对象的“工厂”。OkHttpClient实例创建方式有两种:

(1)直接通过new的方式实例化:

// The singleton HTTP client.
public final OkHttpClient client = new OkHttpClient();
(2)通过OkHttpClient.Builder构造实例,此种方式支持自定义部分行为:

// The singleton HTTP client.
public final OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new HttpLoggingInterceptor())
.cache(new Cache(cacheDir, cacheSize))
.build();
我们在使用OkHttpClient实例时,最好确保它在整个应用中都是唯一的单例。client实例会持有它自己的连接池和线程池,确保client的全局唯一可以让我们在所有的请求中复用这些连接和线程,这有助于减少内存资源的消耗。
参考技术A 概述
OKHttp是处理网络请求的开源框架,Andorid当前最火热的网络框架,Retrofit的底层也是OKHttp,用于替换HttpUrlConnection和Apache HttpClient(API23 6.0已经移除)。
概况起来说OKHttp是一款优秀HTTP框架,它支持GET和POST请求,支持Http的文件上传和下载,支持加载图片,支持下载文件透明的GZIP压缩,支持响应缓存避免重复的网络请求,支持使用连接池来降低响应延迟的问题。
OKHttp的优点:

1.支持HTTP2/SPDY,这使得对同一个主机发出的所有请求都可以共享相同的套接字连接。

2.如果HTTP2/SPDY不可用OkHttp,会使用连接池来复用连接以提高效率。

3.提供了对 GZIP 的默认支持来降低传输内容的大小

4.提供了对 HTTP 响应的缓存机制,可以避免不必要的网络请求

5.当网络出现问题时,OkHttp会自动重试一个主机的多个 IP 地址
参考技术B 为此,官方还提供了newBuilder()的api来帮助我们创建支持自定义参数的可全局共享的OkHttpClient实例:为此,官方还提供了newBuilder()的api来帮助我们创建支持自定义参数的可全局共享的OkHttpClient实例:为此,官方还提供了newBuilder()的api来帮助我们创建支持自定义参数的可全局共享的OkHttpClient实例。

OkHttp框架中Proxy的那点事儿

在OkHttp框架中,已经集成好了网络请求代理Proxy的功能,我们只需要调用如下API,即可实现使用代理地址访问目标服务器:

OkHttpClient.Builder builder = new OkHttpClient.Builder();

// 设置代理地址
SocketAddress sa = new InetSocketAddress("代理服地址", 代理端口);
builder.proxy(new Proxy(Proxy.Type.HTTP, sa));

OkHttpClient client = builder.build();
Request.Builder requestBuilder = new Request.Builder();
requestBuilder.url("目标服务器地址");
client.newCall(requestBuilder.build());

那么  什么是代理?该如何实现代理呢?

我将用3篇文章来详细回答上面这个问题:

  1. 这篇文章主要是弄清楚代理(Proxy)的基本原理

  2. 接下来下一篇中,介绍防火墙的相关知识点

  3. 最后一篇通过介绍自己搭建代理服务器,实现合理翻墙


Proxy基本原理

最常见的代理有2种:正向代理反向代理

正向代理(forward proxy)

是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。

这种代理其实在生活中是比较常见的,比如访问外国技术网站(Google、Medium等),其用到的就是正向代理技术。

当我们想访问Google时,国内网络是无法直接访问的,但是通常我们可以通过各种代理工具来间接访问,这方面做得不错的有 Shadowsocks 和 Astrill等。通过Shadowsocks和Astrill,浏览器会将所有用户请求先发送到代理服务器上,由代理服务器代为转发请求,并且该代理服务器也会将请求的响应再返回给了浏览。整个流程如下图所示:

正向代理有个明显的特点:代理服务器是在客户端设置的

所以,正向代理,其实是"代理服务器"代理了"客户端",去和"目标服务器"进行交互。通过"正向代理服务器"访问"目标服务器","目标服务器"是不知道真正的"客户端"是谁的,甚至不知道访问自己的是一个"代理"。

反向代理(reverse proxy)

是指"服务器端"主动部署"代理服务器"来接受互联网上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给客户端,此时代理服务器对外就表现为一个反向代理服务器。

生活中有一个例子非常像反向代理,当我们在网络平台上租房时,为了过滤掉不良中介,有时会筛选出租者为“个人”的选项。我们以为我们接触的是房东,其实有时候也有可能并非房主本人,有可能是他的亲戚、朋友,甚至是二房东。但是我们并不知道和我们沟通的并不是真正的房东。这种帮助真正的房主租房的二房东其实就是反向代理服务器,这个过程就是反向代理。

对于常用的场景,就是我们在Web开发中用到的负载均衡服务器。比如我们在浏览器中直接访问链接 baidu.com 时,我们以为这个链接就是百度的服务器地址,但实际上DNS查询到的baidu.com IP地址只是百度一个负载均衡的代理服务器地址。由这个负载均衡来将相应的请求分发到不同的内部服务器中进行处理。最终结果也是由负载均衡器返回到客户端。整个过程如下图所示:

反向代理有个明显的特点:代理服务器是部署在服务器端的

所以,反向代理,其实是"代理服务器"代理了"目标服务器",去和"客户端"进行交互。通过反向代理服务器访问目标服务器时,客户端是不知道真正的目标服务器是谁的,甚至不知道自己访问的是一个代理。

总结

用一句话总结正向代理和反向代理的区别就是:

正向代理隐藏真实客户端,反向代理隐藏真实服务端。

本系列文章的内容是自己动手实现OkHttp框架,但实际最终目标是带领大家在实现过程中,对http协议(也有部分TCP协议)有一个完整深入的理解,这整个实现过程也可以看做是对http协议的二次封装。

如果你喜欢本文

长按二维码关注

以上是关于okhttp3每次new的主要内容,如果未能解决你的问题,请参考以下文章

从 Android N (--min-api 24) 开始支持:okhttp3.Request okhttp3.Authenticator

Java封装OkHttp3工具类

Picasso:设置旧版本的 OkHttp3

Android实战——okhttp3的使用和封装

Okhttp3:使用 HeaderInterceptor 需要帮助

缺少类:okhttp3.internal.http.UnrepeatableRequestBody