您的位置:首页 > 理论基础 > 计算机网络

(4.2.36.2)HTTP之OkHttp(二): okhttp3与旧版本okhttp的区别分析

2016-09-26 18:56 351 查看


1、包名改变

包名改了由之前的 
com.squareup.http.
改为 
okhttp3.


我们需要将导包名直接换掉,另外如果代码混淆的话记得修改
progurad-rules.pro
 文件中将对应包名.


2、OkHttpClient参数配置

之前参数可以直接
mOkHttpClient.setCache(cache)
设置,现在
OkHttpClient
使用创建者模式,需要在
OkHttpClient.Builder
上设置可配置的参数如下:
Dispatcher dispatcher; // 分发
Proxy proxy; // 代理
List<Protocol> protocols;
List<ConnectionSpec> connectionSpecs;
final List<Interceptor> interceptors = new ArrayList<>(); // 拦截器
final List<Interceptor> networkInterceptors = new ArrayList<>(); // 网络拦截器
ProxySelector proxySelector;
CookieJar cookieJar;
Cache cache; // 缓存
InternalCache internalCache;
SocketFactory socketFactory;
SSLSocketFactory sslSocketFactory;
HostnameVerifier hostnameVerifier;
CertificatePinner certificatePinner;
Authenticator proxyAuthenticator; // 代理证书
Authenticator authenticator; // 证书
ConnectionPool connectionPool;
Dns dns; // DNS
boolean followSslRedirects;
boolean followRedirects;
boolean retryOnConnectionFailure;
int connectTimeout;
int readTimeout;
int writeTimeout;

例如:
okhttp3.0之前:



Paste_Image.png

okhttp3.0之后:



Paste_Image.png


3、OkHttpClient创建方式不同

okhttp直接
new
OkHttpClient
,而okhttp3中提供了
Builder
,很好的使用了创建者设计模式.


4、cookie的设置方式不同:

okhttp调用OkHttpClient的
setCookieHandler
方法,
CookieHandler
是Android
SDK提供的标注的cookie管理,
CookieHandler
的之类
CookieManager
实现了cookie的具体管理方法,构建CookieManager需要实现CookieStore接口,系统提供了一个默认的实现
CookieStoreImpl
,只负责把cookie存储在内存中。okhttp3中已经没有
setCookieHandler
方法了,而改成了cookieJar,新增了Builder,用Builder构建okhttp,设置cookie在Builder的cookieJar方法中设置。

如下:
okhttp3 之前用CookieHandler管理cookie,如下:
/* cookie管理 */
mCookieHandler = new CookieManager(null, CookiePolicy.ACCEPT_ALL);
mOkHttpClient.setCookieHandler(mCookieHandler);

3.0 之后新增了两个类Cookiejar、Cookie两个类,开放接口,需要用户自己去实现cookie的配管理。用户可以直接在CookieJar中简单设置Cookie的管理,如下:
okHttpClientBuilder.cookieJar(new CookieJar() {
private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>();
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
cookieStore.put(url, cookies);
}

@Override
public List<Cookie> loadForRequest(HttpUrl url) {
List<Cookie> cookies = cookieStore.get(url);
return cookies != null ? cookies : new ArrayList<Cookie>();
}
});


5、post消息体构建方式不同

okhttp使用
MultipartBuilder
FormEncodingBuilder
构建post消息体,最终构建出来的都是
RequestBody
,而okhttp3增加了RequestBody的子类,构造器放到了RequestBody的子类中,
MultipartBody.Builder
既可以添加表单数据,也可以添加文件等二进制数据。
okhttp3.0之前:



Paste_Image.png

okhttp3.0之后:



Paste_Image.png


6、Call和Callback不同

okhttp的callback方法是
void onFailure(Request request, IOException e);
void onResponse(Response response) throws IOException;

okhttp3 的Callback方法有
void onFailure(Call call, IOException e);
void onResponse(Call call, Response response) throws IOException;

okhttp3对Call做了更简洁的封装,okhttp3 Call是个接口,okhttp的call是个普通class,一定要注意,无论哪个版本,call都不能执行多次,多次执行需要重新创建。


7、OkHttpClient的Cancel方法去掉

3.0之前我们去掉call 可以直接使用
mOkHttpClient.cancel(tag);


3.0之后直接阉割掉此方法我们可以采用如下方法:
public void cancelCallsWithTag(Object tag) {
checkInit();

if (tag == null) {
return;
}

synchronized (mOkHttpClient.dispatcher().getClass()) {
for (Call call : mOkHttpClient.dispatcher().queuedCalls()) {
if (tag.equals(call.request().tag())) call.cancel();
}

for (Call call : mOkHttpClient.dispatcher().runningCalls()) {
if (tag.equals(call.request().tag())) call.cancel();
}
}
}


8、对https支持的不同

okhttp默认调用了
getDefaultSSLSocketFactory
方法,该方法提供了默认的
SSLSocketFactory
,就算不设置
SSLSocketFactory
也可以支持
https
,
setSslSocketFactory
没有做非空判断,如果设置为空,则使用默认的
SSLSocketFactory

okhttp3设置https的方法
sslSocketFactory
,对
SSLSocketFactory
做了非空判断,为空会抛出异常。如果不主动设置
SSLSocketFactory
,okhttp3也提供了默认的http3支持。
if (builder.sslSocketFactory != null || !isTLS) {
this.sslSocketFactory = builder.sslSocketFactory;
} else {
try {
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, null, null);
this.sslSocketFactory = sslContext.getSocketFactory();
} catch (GeneralSecurityException e) {
throw new AssertionError(); // The system has no TLS. Just give up.
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: