创建客户端
概述
Solpic
中的HTTP
客户端接口为cn.vlts.solpic.core.http.HttpClient
,可以通过下面几种方式获取HttpClient
实例:
- 通过
Solpic
提供的静态工厂方法或者建造者加载 - 通过
SPI
增强模块加载 - 手动创建
HttpClient
接口的具体实现类对象(不推荐)
TIP
SPI
增强模块,可以参考SPI 增强小节。
内置客户端实现
Solpic
已经完成当前主流的HTTP
组件的适配,见下表:
编码 | 实现类 | JDK 版本要求 | 类库 |
---|---|---|---|
default | DefaultHttpClient | JDK[8 | JDK 内置java.net.HttpURLConnection |
jhc | JdkHttpClientImpl | JDK[11 | JDK 内置java.net.http.HttpClient |
ahc5 | ApacheHttpClientV5Impl | - | org.apache.httpcomponents.client5:httpclient5:5.x.y |
ahc4 | ApacheHttpClientV4Impl | - | org.apache.httpcomponents:httpclient:4.x.y |
okhttp | OkHttpClientImpl | - | com.squareup.okhttp3:okhttp:4.x.y |
使用SPI
加载HttpClient
实例会自适应优选合适的实现,上表中的编码就是SPI
加载条目的key
,优先级如下:
shell
jhc(1) -> ahc5(2) -> okhttp(3) -> ahc4(4) -> default(5)
使用静态工厂方法或者建造者
使用Solpic
提供的静态工厂方法或者建造者,底层本质还是依赖SPI
增强模块进行加载。使用静态工厂方法如下:
java
// 创建适合当前JDK和项目依赖的HTTP客户端
HttpClient httpClient = Solpic.newHttpClient();
// 可以通过编码指定需要创建的的HTTP客户端具体底层实现类型
HttpClient httpClient = Solpic.newHttpClient("ahc5");
如果想更细粒度精准控制HTTP
客户端的初始化参数,可以使用Builder
模式。例如:
java
public static void main(String[] args) throws Exception{
HttpClient httpClient = Solpic.newHttpClientBuilder()
.name("default") // HTTP客户端底层实现编码,见'内置客户端实现'小节,也可以基于SPI加载自定义的HTTP客户端实现
.addMinimumOption(HttpOptions.HTTP_ENABLE_LOGGING) // 添加最小选项集合
.addAvailableOption(HttpOptions.HTTP_ENABLE_LOGGING) // 添加可用选项集合
.addInterceptor(new LoggingInterceptor()) // 添加拦截器实现
.option(HttpOptions.HTTP_ENABLE_LOGGING, true) // 配置选项和对应的值
// .type(HttpClientType.DEFAULT) // HTTP客户端类型枚举,优先级次于name()
.build();
}
使用 SPI 加载
通过SPI
增强模块加载可以更加简单灵活地加载HttpClient
实例,默认所有通过SPI
增强模块的HttpClient
实例都是原型的(也就是非单例)。例如:
java
HttpClient httpClient = SpiLoader.getSpiLoader(HttpClient.class).getService("default");
手动创建
如果确保JDK
版本合适或者项目中已经引入了具体HTTP
组件依赖,可以手动创建对应的HttpClient
实例。例如:
java
HttpClient jdkHttpClient = new JdkHttpClientImpl();
HttpClient defaultHttpClient = new DefaultHttpClient();
不推荐使用这种方式,因为需要管理对应客户端实例的生命周期,同时有可能存在兼容性问题。