實(shí)現(xiàn)網(wǎng)絡(luò)基本配置
1. 我們定義一個(gè)抽象類HttpConfig
public abstract class HttpConfig {
//設(shè)置默認(rèn)代理
public String userAgent = "default";
//設(shè)置默認(rèn)讀取時(shí)間
public int soTimeOut = 10000;
//設(shè)置默認(rèn)連接時(shí)間
public int ConnTimeOut = 10000;
}
2. 實(shí)現(xiàn)具體的HttpClientConfig和HttpUrlConnConfig
- 疑點(diǎn):為什么這里需要對(duì)設(shè)置進(jìn)行劃分藕漱?
因?yàn)槲覀冞x擇在SDK小于9的情況下,選擇使用HttpClient威蕉,而當(dāng)SDK大于或等于9時(shí)橄仍,選擇使用HttpURLConnection牍戚。
- 疑點(diǎn):為什么需要對(duì)其進(jìn)行劃分呢虑粥?
我們知道Android Framework里面同時(shí)包含HttpURLConnection和Apache HTTP Client 2套Http框架,HttpURLConnection相對(duì)輕量級(jí)娩贷,也比較小,而Apache HTTP Client接口多但荤,比較大,HttpURLConnection是最佳選擇腹躁,但在Android SDK小于9時(shí)南蓬,HttpURLConnection存在一些bug,所以當(dāng)Android SDK小于9時(shí)赘方,使用HttpClient,否則使用HttpURLConnection炕淮。
HttpClientConfig的實(shí)現(xiàn)
/**
* Created by lq on 2017/5/14.
* 這是針對(duì)使用HttpClientStack執(zhí)行請(qǐng)求時(shí)為https請(qǐng)求配置的SSLSocketFactory類
*/
public class HttpClientConfig extends HttpConfig {
private static HttpClientConfig sConfig = new HttpClientConfig();
private SSLSocketFactory mSslSocketFactory;
private HttpClientConfig(){
}
public static HttpClientConfig getConfig(){
return sConfig;
}
//配置https請(qǐng)求的SSLSocketFactory
public void setHttpsConfig(SSLSocketFactory sslSocketFactory){
mSslSocketFactory = sslSocketFactory;
}
public SSLSocketFactory getSslSocketFactory(){
return mSslSocketFactory;
}
}
- 疑點(diǎn):http請(qǐng)求與https請(qǐng)求的區(qū)別跳夭?
HTTPS并非是應(yīng)用層的一種新協(xié)議。只是HTTP通信接口部分用SLL和TLS協(xié)議代替而已润歉。通常,HTTP直接和TCP通信踩衩,當(dāng)使用SSL時(shí)贩汉,演變成先和SSL通信,再由SSL和TCP通信匹舞。簡(jiǎn)而言之,所謂HTTPS晶疼,其實(shí)就是身披SSL協(xié)議的這層外殼的HTTP又憨。
因此,針對(duì)Https請(qǐng)求蠢莺,我們提供了一個(gè)設(shè)置SSL的接口來(lái)實(shí)現(xiàn)對(duì)其進(jìn)行不同的設(shè)置。
HttpUrlConnConfig的實(shí)現(xiàn)
/**
* Created by lq on 2017/5/14.
* 這是針對(duì)使用HttpUrlStack執(zhí)行請(qǐng)求時(shí)為https請(qǐng)求設(shè)置的SSLSocketFactory和HostnameVerifier的配置類
*/
public class HttpUrlConnConfig extends HttpConfig {
private static HttpUrlConnConfig sConfig = new HttpUrlConnConfig();
private SSLSocketFactory mSslSocketFactory = null;
private HostnameVerifier mHostnameVerifier = null;
private HttpUrlConnConfig(){
}
public static HttpUrlConnConfig getConfig(){
return sConfig;
}
//配置https請(qǐng)求的SSLSocketFactory與HostnameVerifier
public void setHttpsConfig(SSLSocketFactory sslSocketFactory,
HostnameVerifier hostnameVerifier){
mSslSocketFactory = sslSocketFactory;
mHostnameVerifier = hostnameVerifier;
}
public HostnameVerifier getHostnameVerifier(){
return mHostnameVerifier;
}
public SSLSocketFactory getSslSocketFactory() {
return mSslSocketFactory;
}
}
- 疑問(wèn):HostnameVerifier是一個(gè)什么配置锄弱?
這是一個(gè)用于主機(jī)名驗(yàn)證的基接口祸憋。在握手期間,如果URL的主機(jī)名和服務(wù)器的標(biāo)識(shí)主機(jī)名不匹配蚯窥,則驗(yàn)證機(jī)制可以回調(diào)此接口實(shí)現(xiàn)的程序來(lái)判斷是否允許此連接。
- 疑問(wèn):為什么在HttpClientConfig中沒(méi)有此配置巍沙?
實(shí)際上是因?yàn)槲覀儾扇×薍ttpClient忽略證書(shū)的方式荷鼠。