美文网首页
实现一个简单的网络框架之配置篇

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

作者: 大海孤了岛 | 来源:发表于2017-05-16 13:45 被阅读23次

    实现网络基本配置

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

    相关文章

      网友评论

          本文标题:实现一个简单的网络框架之配置篇

          本文链接:https://www.haomeiwen.com/subject/epnptxtx.html