实现网络基本配置
1. 我们定义一个抽象类HttpConfig
public abstract class HttpConfig {
//设置默认代理
public String userAgent = "default";
//设置默认读取时间
public int soTimeOut = 10000;
//设置默认连接时间
public int ConnTimeOut = 10000;
}
2. 实现具体的HttpClientConfig和HttpUrlConnConfig
- 疑点:为什么这里需要对设置进行划分?
因为我们选择在SDK小于9的情况下,选择使用HttpClient,而当SDK大于或等于9时,选择使用HttpURLConnection。
- 疑点:为什么需要对其进行划分呢?
我们知道Android Framework里面同时包含HttpURLConnection和Apache HTTP Client 2套Http框架,HttpURLConnection相对轻量级,也比较小,而Apache HTTP Client接口多,比较大,HttpURLConnection是最佳选择,但在Android SDK小于9时,HttpURLConnection存在一些bug,所以当Android SDK小于9时,使用HttpClient,否则使用HttpURLConnection。
HttpClientConfig的实现
/**
* Created by lq on 2017/5/14.
* 这是针对使用HttpClientStack执行请求时为https请求配置的SSLSocketFactory类
*/
public class HttpClientConfig extends HttpConfig {
private static HttpClientConfig sConfig = new HttpClientConfig();
private SSLSocketFactory mSslSocketFactory;
private HttpClientConfig(){
}
public static HttpClientConfig getConfig(){
return sConfig;
}
//配置https请求的SSLSocketFactory
public void setHttpsConfig(SSLSocketFactory sslSocketFactory){
mSslSocketFactory = sslSocketFactory;
}
public SSLSocketFactory getSslSocketFactory(){
return mSslSocketFactory;
}
}
- 疑点:http请求与https请求的区别?
HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SLL和TLS协议代替而已。通常,HTTP直接和TCP通信,当使用SSL时,演变成先和SSL通信,再由SSL和TCP通信。简而言之,所谓HTTPS,其实就是身披SSL协议的这层外壳的HTTP。
因此,针对Https请求,我们提供了一个设置SSL的接口来实现对其进行不同的设置。
HttpUrlConnConfig的实现
/**
* Created by lq on 2017/5/14.
* 这是针对使用HttpUrlStack执行请求时为https请求设置的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请求的SSLSocketFactory与HostnameVerifier
public void setHttpsConfig(SSLSocketFactory sslSocketFactory,
HostnameVerifier hostnameVerifier){
mSslSocketFactory = sslSocketFactory;
mHostnameVerifier = hostnameVerifier;
}
public HostnameVerifier getHostnameVerifier(){
return mHostnameVerifier;
}
public SSLSocketFactory getSslSocketFactory() {
return mSslSocketFactory;
}
}
- 疑问:HostnameVerifier是一个什么配置?
这是一个用于主机名验证的基接口。在握手期间,如果URL的主机名和服务器的标识主机名不匹配,则验证机制可以回调此接口实现的程序来判断是否允许此连接。
- 疑问:为什么在HttpClientConfig中没有此配置?
实际上是因为我们采取了HttpClient忽略证书的方式。