Skip to content

创建客户端

概述

Solpic中的HTTP客户端接口为cn.vlts.solpic.core.http.HttpClient,可以通过下面几种方式获取HttpClient实例:

  • 通过Solpic提供的静态工厂方法或者建造者加载
  • 通过SPI增强模块加载
  • 手动创建HttpClient接口的具体实现类对象(不推荐

TIP

SPI增强模块,可以参考SPI 增强小节。

内置客户端实现

Solpic已经完成当前主流的HTTP组件的适配,见下表:

编码实现类JDK 版本要求类库
defaultDefaultHttpClientJDK[8JDK内置java.net.HttpURLConnection
jhcJdkHttpClientImplJDK[11JDK内置java.net.http.HttpClient
ahc5ApacheHttpClientV5Impl-org.apache.httpcomponents.client5:httpclient5:5.x.y
ahc4ApacheHttpClientV4Impl-org.apache.httpcomponents:httpclient:4.x.y
okhttpOkHttpClientImpl-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();

不推荐使用这种方式,因为需要管理对应客户端实例的生命周期,同时有可能存在兼容性问题。

贡献者

页面历史

Released under the MIT License.