连接

Kalle是一个完全独立的网络库,它不限制任何实现Http协议底层连接库,因此它允许开发者自行决定使用何种底层连接库,比如URLConnectionOkHttp、HttpClient。为了减小编译后Kalle的大小,Kalle默认提供了基于URLConnection的底层连接库(因为URLConnction是Java默认自带的),同时实现了基于OkHttp`的备用的底层连接库,有兴趣的开发者可以自行实现基于其它项目的底层连接库。

URLConnection 和 OkHttp

如果没有配置连接工厂,那么Kalle默认使用基于URLConnection的的连接工厂,开发者也可以明确指定使用默认的连接工厂:

KalleConfig.newBuilder()
    ...
    .connectFactory(URLConnectionFactory.newBuilder().build())
    .build()

如果开发者需要指定底层使用基于OkHttp实现的连接工厂:

KalleConfig.newBuilder()
    ...
    .connectFactory(OkHttpConnectFactory.newBuilder().build())
    .build()

URLConnectionFactoryOkHttpConnectFactory在Android4.4以上没有太大的区别。在Android4.4以下的系统中URLConnection不支持DELETE的请求方法发送Body,这是一个jre的底层bug,我们没有任何办法让它支持;在Android4.4及以上的系统中URLConnection使用OkHttp2来实现,所以是没有这一个bug的。在Android4.4及以上系统中,使用URLConnectionFactoryOkHttpConnectFactory的唯一区别是URLConnectionFactory用的OkHttp2,OkHttpConnectFactory使用的是OkHttp3。

建议:如果你的应用需要在Android4.4以下的系统中运行,并且使用了DELETE请求方法,那么建议你直接使用OkHttpConnectFactory。如果只在Android4.4以上的系统运行,或者在Android4.4以下的系统中运行时只用到简单的GET和POST请求时建议使用URLConnectionFactory,因为它小而且不会含OkHttp和OkIO。

自定义实现

连接工厂是一个接口:

public interface ConnectFactory {
    /**
     * According to the request attribute,
     * and the server to establish a connection.
     */
    Connection connect(Request request) throws IOException;
}

如果开发者自行实现了这个接口,只需要在被调用时,使用url建立连接,并且把Request中的所有请求头设置给负责底层连接的库即可,然后返回Conneciton接口即可。

Connection也是一个接口:

public interface Connection extends Closeable {

    /**
     * Gets output stream for socket.
     */
    OutputStream getOutputStream() throws IOException;

    /**
     * Gets response code for server.
     */
    int getCode() throws IOException;

    /**
     * Gets response headers for server.
     */
    Map<String, List<String>> getHeaders() throws IOException;

    /**
     * Gets input stream for socket.
     */
    InputStream getInputStream() throws IOException;

}

这里需要能拿到连接的输入流,以供Kalle发送数据;需要能拿到响应码以供Kalle和开发者处理业务;需要能拿到响应头,以供Kalle判断如何读取响应包体;需要能拿到输出流,以供Kalle读取响应包体。
Connection接口继承了Closeable接口,在close()方法被调用时应该断开此次请求时建立的连接。

results matching ""

    No results matching ""