# httpclient **Repository Path**: gzcltech/httpclient ## Basic Information - **Project Name**: httpclient - **Description**: No description available - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-25 - **Last Updated**: 2026-07-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # httpclient 基于 [OkHttp](https://square.github.io/okhttp/) 的通用 HTTP 客户端封装,支持连接池 / 超时 / Dispatcher、拦截器、Fluent API、同步与 `CompletableFuture` 异步,以及 Spring Boot 下基于 spring-retry 的可配置重试。 | 模块 | 说明 | |------|------| | `httpclient-okhttp` | 纯 Java 核心,无 Spring 依赖 | | `httpclient-okhttp-spring-boot-starter` | 自动配置、`httpclient.okhttp.*` Properties、spring-retry | | `example-httpclient-okhttp` | 用法示例(不发布到仓库) | 当前版本:`4.0.0`(父 POM 中 `${revision}`)。技术栈:Java 25、OkHttp 5.4、Spring Boot 4。 ## Maven 依赖 ### 纯 Java(核心) ```xml io.gitee.gzcltech.httpclient httpclient-okhttp 4.0.0 ``` JSON 编解码可选引入 Jackson(与 Boot BOM 对齐即可): ```xml tools.jackson.core jackson-databind ``` ### Spring Boot Starter ```xml io.gitee.gzcltech.httpclient httpclient-okhttp-spring-boot-starter 4.0.0 ``` 多模块工程也可使用父 POM 的 `${revision}` / dependencyManagement,无需手写版本号。 ## 纯 Java 用法(Builder) ```java import io.gitee.gzcltech.httpclient.okhttp.OkHttpHttpClient; import io.gitee.gzcltech.httpclient.okhttp.OkHttpHttpClientBuilder; import java.time.Duration; OkHttpHttpClient client = new OkHttpHttpClientBuilder() .connectTimeout(Duration.ofSeconds(5)) .readTimeout(Duration.ofSeconds(30)) .connectionPool(16, Duration.ofMinutes(5)) .dispatcher(64, 5) .build(); String body = client.request() .get("https://httpbin.org/get") .queryParam("foo", "bar") .header("X-Demo", "1") .execute(String.class); client.close(); ``` 也可复用已有 `OkHttpClient`,或通过 `okHttpClientCustomizer` / `addInterceptor` 做二次定制。 ## Spring Boot 用法 ### application.yml ```yaml httpclient: okhttp: clients: payment: enabled: true base-url: https://payment.example.com read-timeout: 5s interceptors: - paymentInterceptor customizer: paymentCustomizer converter: paymentConverter connection-pool: max-idle: 8 retry: enabled: true max-attempts: 3 retry-on-status: [429, 502, 503, 504] user-service: read-timeout: 60s ``` ### 多客户端 在 `httpclient.okhttp.clients` 下配置命名客户端;未显式设置的项使用 `ClientCO` 内置默认值。通过 `OkHttpHttpClientRegistry` 获取客户端: ```java import io.gitee.gzcltech.httpclient.okhttp.OkHttpHttpClient; import io.gitee.gzcltech.httpclient.okhttp.OkHttpHttpClientRegistry; import org.springframework.stereotype.Service; @Service public class PaymentService { private final OkHttpHttpClient paymentClient; public PaymentService(OkHttpHttpClientRegistry registry) { this.paymentClient = registry.getRequired("payment"); } } ``` ### 客户端扩展组件 每个客户端可单独指定多个 `Interceptor`、`OkHttpClientCustomizer`、`HttpConverter` Bean 名称,启动时从 Spring 容器解析: ```java import io.gitee.gzcltech.httpclient.okhttp.OkHttpClientCustomizer; import io.gitee.gzcltech.httpclient.okhttp.converter.HttpConverter; import io.gitee.gzcltech.httpclient.okhttp.converter.StringHttpConverter; import okhttp3.Interceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class HttpClientExtensions { @Bean Interceptor paymentInterceptor() { return chain -> chain.proceed( chain.request().newBuilder().header("X-Service", "payment").build()); } @Bean OkHttpClientCustomizer paymentCustomizer() { return builder -> builder.followRedirects(false); } @Bean HttpConverter paymentConverter() { return new StringHttpConverter(); } } ``` 未配置 `converter` 时,默认注册 `StringHttpConverter`、`ByteArrayHttpConverter`,classpath 存在 Jackson 时额外注册 `JacksonHttpConverter`。 ### 注入使用 引入 starter 后会注册 `OkHttpHttpClientRegistry` Bean,通过它按名称获取客户端: ```java import io.gitee.gzcltech.httpclient.okhttp.OkHttpHttpClient; import io.gitee.gzcltech.httpclient.okhttp.OkHttpHttpClientRegistry; import org.springframework.stereotype.Service; @Service public class DemoService { private final OkHttpHttpClient httpClient; public DemoService(OkHttpHttpClientRegistry registry) { this.httpClient = registry.getRequired("payment"); } public String fetch() { return httpClient.request() .get("/orders") .execute(String.class); } } ``` 可通过 `OkHttpClientCustomizer`、`Interceptor`、自定义 `HttpConverter` 等 Bean 扩展自动配置。 ## 示例与设计文档 - 可运行示例:[`example-httpclient-okhttp`](example-httpclient-okhttp/)(`DemoRunner` 演示同步 / 异步 GET) - 设计说明:[`docs/superpowers/specs/2026-07-25-okhttp-httpclient-design.md`](docs/superpowers/specs/2026-07-25-okhttp-httpclient-design.md) - 实现计划:[`docs/superpowers/plans/2026-07-25-okhttp-httpclient.md`](docs/superpowers/plans/2026-07-25-okhttp-httpclient.md) 英文简介见 [README.en.md](README.en.md)。 ## 构建与测试 ## 本地发布 ```text ./mvnw clean install -Plocal ``` ## 上传到中央仓库 ```text ./mvnw clean deploy -Prelease -Ppush-central -DskipTests ``` ## 上传到阿里云私库 ```text ./mvnw clean deploy -Prelease -Ppush-rdc -DskipTests ./mvnw clean deploy -Psnapshot -Ppush-rdc -DskipTests ``` 若 Spotless 检查失败,先执行 `./mvnw spotless:apply` 再重测。 ## 参与贡献 1. Fork 本仓库 2. 新建功能分支 3. 提交代码 4. 发起 Pull Request ## License Apache License, Version 2.0