(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之前:
![](http://upload-images.jianshu.io/upload_images/3678546-ff20543dfdd13e08.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Paste_Image.png
okhttp3.0之后:
![](http://upload-images.jianshu.io/upload_images/3678546-85de8a547a07d37c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
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之前:
![](http://upload-images.jianshu.io/upload_images/3678546-5df7414e9afc3032.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Paste_Image.png
okhttp3.0之后:
![](http://upload-images.jianshu.io/upload_images/3678546-52c3894ff17dd3a9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
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. } }
相关文章推荐
- okhttp3与旧版本okhttp的区别分析
- okhttp3与旧版本okhttp的区别分析
- okhttp3与旧版本okhttp的区别分析
- HTTPClient和URLConnection核心区别分析
- 大神给你分析HTTPS和HTTP的区别
- OKHttp源码分析3 - HttpEngine底层实现
- OkHttp和HttpUrlConnection以及Volley的区别
- 从HTTP协议分析转发和重定向的区别
- Http 中Get与POST的区别分析
- Android 4.4以上使用HttpURLConnection底层使用OkHttp实现的源码分析
- 大神给你分析HTTPS和HTTP的区别
- 对比分析AngularJS中的$http.post与jQuery.post的区别
- 对比分析AngularJS中的$http.post与jQuery.post的区别
- Android Apache common ftp开源库以及http区别分析
- HTTPClient和URLConnection核心区别分析
- 大神给你分析HTTPS和HTTP的区别(转)
- http协议中的get与post方法区别分析
- okhttp3与okhttp的区别
- Http和Https的区别与分析