1、包名改變
包名改了由之前的 com.squareup.http.改為 okhttp3.
我們需要將導(dǎo)包名直接換掉,另外如果代碼混淆的話記得修改progurad-rules.pro 文件中將對應(yīng)包名.
2、OkHttpClient參數(shù)配置
之前參數(shù)可以直接mOkHttpClient.setCache(cache)設(shè)置,現(xiàn)在OkHttpClient使用創(chuàng)建者模式,需要在OkHttpClient.Builder上設(shè)置可配置的參數(shù)如下:
Dispatcher dispatcher; // 分發(fā)
Proxy proxy; // 代理
List<Protocol> protocols;
List<ConnectionSpec> connectionSpecs;
final List<Interceptor> interceptors = new ArrayList<>(); // 攔截器
final List<Interceptor> networkInterceptors = new ArrayList<>(); // 網(wǎng)絡(luò)攔截器
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之前:

okhttp3.0之后:

3、OkHttpClient創(chuàng)建方式不同
okhttp直接new OkHttpClient,而okhttp3中提供了Builder,很好的使用了創(chuàng)建者設(shè)計模式.
4、cookie的設(shè)置方式不同:
okhttp調(diào)用OkHttpClient的setCookieHandler方法,CookieHandler是Android SDK提供的標(biāo)注的cookie管理,CookieHandler的之類CookieManager實現(xiàn)了cookie的具體管理方法,構(gòu)建CookieManager需要實現(xiàn)CookieStore接口,系統(tǒng)提供了一個默認(rèn)的實現(xiàn)CookieStoreImpl,只負(fù)責(zé)把cookie存儲在內(nèi)存中。okhttp3中已經(jīng)沒有setCookieHandler方法了,而改成了cookieJar,新增了Builder,用Builder構(gòu)建okhttp,設(shè)置cookie在Builder的cookieJar方法中設(shè)置。
如下:
okhttp3 之前用CookieHandler管理cookie,如下:
/* cookie管理 */
mCookieHandler = new CookieManager(null, CookiePolicy.ACCEPT_ALL);
mOkHttpClient.setCookieHandler(mCookieHandler);
3.0 之后新增了兩個類Cookiejar、Cookie兩個類,開放接口,需要用戶自己去實現(xiàn)cookie的配管理。用戶可以直接在CookieJar中簡單設(shè)置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消息體構(gòu)建方式不同
okhttp使用MultipartBuilder,FormEncodingBuilder構(gòu)建post消息體,最終構(gòu)建出來的都是RequestBody,而okhttp3增加了RequestBody的子類,構(gòu)造器放到了RequestBody的子類中,MultipartBody.Builder既可以添加表單數(shù)據(jù),也可以添加文件等二進制數(shù)據(jù)。
okhttp3.0之前:

okhttp3.0之后:

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都不能執(zhí)行多次,多次執(zhí)行需要重新創(chuàng)建。
7、OkHttpClient的Cancel方法去掉
3.0之前我們?nèi)サ鬰all 可以直接使用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默認(rèn)調(diào)用了getDefaultSSLSocketFactory方法,該方法提供了默認(rèn)的SSLSocketFactory,就算不設(shè)置SSLSocketFactory也可以支持https,setSslSocketFactory沒有做非空判斷,如果設(shè)置為空,則使用默認(rèn)的SSLSocketFactory。
okhttp3設(shè)置https的方法sslSocketFactory,對SSLSocketFactory做了非空判斷,為空會拋出異常。如果不主動設(shè)置SSLSocketFactory,okhttp3也提供了默認(rèn)的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.
}
}