实现一个简单的网络框架之配置篇

实现网络基本配置

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忽略证书的方式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容