后端API设计【免费下载链接】feignFeign makes writing java http clients easier项目地址https://gitcode.com/gh_mirrors/fe/feign点击查看免费下载Apache HttpClient 是 Java 生态中最成熟、功能最丰富的 HTTP 客户端之一。本指南围绕 Feign 仓库中的feign-httpclient模块httpclient/README.md完整讲解如何在 Feign 中接入 Apache HttpClient 4深入剖析请求超时、重定向、Header、请求体、响应映射的底层实现并给出测试用例佐证帮助你掌握可复用的 HTTP 客户端切换实战方案。模块概览feign-httpclient 是什么feign-httpclient是 Feign 官方提供的一个可选集成模块作用非常单一且明确把 Feign 发出的 HTTP 请求转交给 Apache HttpClient4.x 分支去执行。该模块的实现位于 ApacheHttpClient.java核心类ApacheHttpClient实现了 Feign 核心定义的标准客户端接口 Client.java。从模块的 Maven 坐标见 httpclient/pom.xml可以看到artifactId为feign-httpclient隶属于io.github.openfeign组依赖feign-core核心 API与org.apache.httpcomponents:httpclient版本由父 POM 中httpclient4.version控制当前仓库锁定为4.5.14见 pom.xml 第 225 行通过dependencyManagement额外固定了commons-codec版本用于修复其传递依赖引入的已知安全漏洞pom 中注释明确标注了 Snyk 漏洞编号 SNYK-JAVA-COMMONSCODEC-561518。ApacheHttpClient的 Javadoc 直接给出了与 README 一致的用法示例说明这是一个开箱即用、专为替代 Feign 默认 Client 而设计的模块。需要特别注意的是本模块面向Apache HttpClient 4.x如果你使用的是 Apache HttpClient 5.x请改用同仓库中的feign-hc5模块hc5/README.md其客户端类名为ApacheHttp5Client。快速开始三步接入 Apache HttpClient根据 httpclient/README.md 的核心示例接入流程分为两步第一步把模块加入 classpath第二步在构建 Feign 时指定客户端。以 README 中的 GitHub 场景为例GitHub github Feign.builder() .client(new ApacheHttpClient()) .target(GitHub.class, https://api.github.com);使用 Maven 引入依赖dependency groupIdio.github.openfeign/groupId artifactIdfeign-httpclient/artifactId version13.16-SNAPSHOT/version /dependencyApacheHttpClient提供了两个构造函数见 ApacheHttpClient.java无参构造内部调用HttpClientBuilder.create().build()生成一个默认的 Apache HttpClient 实例适合大多数快速接入场景带参构造ApacheHttpClient(HttpClient client)接受任意org.apache.http.client.HttpClient实例用于注入你自定义配置的客户端连接池、代理、SSL、拦截器等。注入自定义 Apache HttpClient连接池与高级配置实战中往往需要精细控制连接复用与线程安全这时应使用带参构造注入自定义实例。Feign 的 Client.java 明确要求实现应当是线程安全的而 Apache HttpClient 4.x 的CloseableHttpClient本身就是线程安全的因此可以在多个 Feign 客户端或多次调用间共享import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; PoolingHttpClientConnectionManager cm new PoolingHttpClientConnectionManager(); cm.setMaxTotal(200); cm.setDefaultMaxPerRoute(50); CloseableHttpClient httpClient HttpClientBuilder.create() .setConnectionManager(cm) .build(); GitHub github Feign.builder() .client(new ApacheHttpClient(httpClient)) .target(GitHub.class, https://api.github.com);这一用法在测试代码 ApacheHttpClientTest.java 中同样出现——测试通过new ApacheHttpClient(HttpClientBuilder.create().build())注入客户端验证了带参构造是官方支持的常规路径。源码剖析Feign 请求如何转换成 Apache 请求ApacheHttpClient的核心入口是execute(Request, Options)方法ApacheHttpClient.java流程分三步构造HttpUriRequest→ 交给 Apache 客户端执行 → 把HttpResponse转回 Feign 的Response。其中请求转换逻辑toHttpUriRequest是最值得研究的部分。1. 请求级超时与重定向Options 如何生效RequestConfig requestConfig (client instanceof Configurable ? RequestConfig.copy(((Configurable) client).getConfig()) : RequestConfig.custom()) .setConnectTimeout(options.connectTimeoutMillis()) .setSocketTimeout(options.readTimeoutMillis()) .setRedirectsEnabled(options.isFollowRedirects()) .build();源码会以每个请求为单位把 Feign 的Request.Options映射为 Apache 的RequestConfig连接超时connectTimeoutMillis、读超时readTimeoutMillis映射为 socket timeout以及是否跟随 3xx 重定向followRedirects。如果注入的客户端实现了 Apache 的Configurable接口还会先复制客户端级配置再覆盖这些值实现客户端全局配置 请求级覆盖的叠加效果。Options定义在核心模块 Request.java 中推荐使用带TimeUnit的构造方法例如测试中的写法new Options(1, TimeUnit.SECONDS, 1, TimeUnit.SECONDS, true); // 等价于旧版new Options(1000, 1000, true)已标记 Deprecated注意followRedirects是每请求生效的测试 ApacheHttpClientTest.java 中当followRedirectstrue时请求会命中重定向后的/redirected路径并返回 200当followRedirectsfalse时则直接抛出FeignException且status()为 302。2. URL 与查询参数的重建URI uri new URIBuilder(request.url()).build(); requestBuilder.setUri(uri.getScheme() :// uri.getAuthority() uri.getRawPath()); ListNameValuePair queryParams URLEncodedUtils.parse(uri, requestBuilder.getCharset()); for (NameValuePair queryParam : queryParams) { requestBuilder.addParameter(queryParam); }转换时先解析 Feign 的完整 URL把 scheme、authority、原始路径raw path保留编码作为 URI再把查询字符串拆解为参数列表逐条通过addParameter重建。测试queryParamsAreRespectedWhenBodyIsEmptyApacheHttpClientTest.java专门验证了即使请求体为空查询参数foofoo也会被正确保留并发送。3. Header 处理的两个关键细节if (headerName.equalsIgnoreCase(Util.CONTENT_LENGTH)) { // The Content-Length header is always set by the Apache client and it // doesnt like us to set it as well. continue; } ... if (!hasAcceptHeader) { requestBuilder.addHeader(ACCEPT_HEADER_NAME, */*); }Content-Length 会被跳过Apache HttpClient 会自行计算并设置Content-Length不允许调用方重复设置因此源码中遇到该 Header 直接continue缺失 Accept 时补*/*注释说明有些服务器不接受默认的 accept 字符串所以只要请求头里没有显式Accept就统一补上Accept: */*。4. 请求体的三种处理路径if (request.body() ! null) { if (request.charset() ! null) { entity new StringEntity(content, contentType); // 带字符集 → 字符串实体 } else { entity new ByteArrayEntity(request.body()); // 无字符集 → 原始字节实体 } requestBuilder.setEntity(entity); } else { requestBuilder.setEntity(new ByteArrayEntity(new byte[0])); // 空体也显式设置 }当请求体存在且有字符集时优先构造StringEntity其Content-Type取自请求头getContentType方法会解析Content-Type若未携带 charset 则回退使用request.charset()无字符集时使用ByteArrayEntity原样发送二进制。即使没有请求体也会显式设置一个空ByteArrayEntity从而保证Content-Length: 0这类语义正确——这正是测试注释 ensuring Content-Length is sent when specified 所覆盖的行为。响应转换从 HttpResponse 到 Feign Response执行完成后toFeignResponseApacheHttpClient.java完成反向映射状态行statusCode与reasonPhrase原样透传响应头由于 HTTP 允许同名多值 Header源码用MapString, CollectionString累积保证同名 Header 不丢失响应体包装为Response.Body匿名实现提供length()由Content-Length推导超过Integer.MAX_VALUE时返回 null、isRepeatable()、asInputStream()、asReader()等方法其中asReader()默认以 UTF-8 解码也可传入自定义Charset。close()方法体现了资源管理的关键细节先通过EntityUtils.consume(entity)消费实体释放底层连接便于连接池复用若响应是CloseableHttpResponse再关闭响应流避免连接泄漏。行为验证测试如何保证集成正确性模块的测试类ApacheHttpClientTest继承自核心模块的AbstractClientTestfeign-core 以 test-jar 形式提供见 httpclient/pom.xml这意味着它复用了 Feign 核心的整套跨 Client 行为测试只要newBuilder()返回.client(new ApacheHttpClient())的 Builder即可验证客户端无关的通用契约。同时它又补充了本模块特有的行为测试测试场景验证结论redirectWithoutLocationHeaderKeepsRetryableException...303 响应且无 Location 时抛出RetryableException其 cause 链为ClientProtocolException→ProtocolException配合ExceptionPropagationPolicy.UNWRAPqueryParamsAreRespectedWhenBodyIsEmpty空请求体下查询参数仍完整发送且空体以空字符串形式传输followRedirectIsRespected/notFollowRedirectIsRespectedOptions.followRedirects的 true/false 两个分支行为均符合预期这些测试基于 OkHttp 的MockWebServertest 依赖搭建本地 mock 服务如果你要基于本模块开发或验证自己的扩展可参照同样的测试骨架。使用注意事项小结版本选型feign-httpclient面向 Apache HttpClient 4.x当前仓库锁定 4.5.14Apache HttpClient 5.x 请使用feign-hc5模块。线程安全Apache HttpClient 4.x 实例线程安全可跨 Feign 客户端共享Feign 的Client契约同样要求线程安全。超时语义readTimeoutMillis映射为 socket 超时、connectTimeoutMillis映射为连接超时两者均以请求为单位逐请求设置也可通过带参构造注入预配置的客户端来提供全局默认值。重定向Options.followRedirects控制是否跟随 3xx关闭时将以FeignException携带 3xx 状态码暴露给调用方。Header 约定Content-Length由 Apache 客户端接管无需也不应手动设置缺失Accept时会自动补*/*。依赖安全模块通过dependencyManagement固定commons-codec版本以规避已知漏洞升级依赖时注意保持该约束。延伸阅读模块用法与定位httpclient/README.md核心实现ApacheHttpClient.java行为测试ApacheHttpClientTest.java模块构建配置httpclient/pom.xml客户端接口契约Client.java请求级选项定义Request.javaApache HttpClient 5 版本hc5/README.md赞分享后端API设计【免费下载链接】feignFeign makes writing java http clients easier项目地址https://gitcode.com/gh_mirrors/fe/feign点击查看免费下载相关推荐Angular angular/common/http 公共 API 全景解析从 HttpClient 重载签名到 httpResource 响应式请求Angular angular/common/http 公共 API 全景解析从 HttpClient 重载签名到 httpResource 响应式请求 前端Web框架ShareGPT用户指南7个技巧让你的ChatGPT对话分享更受欢迎ShareGPT用户指南7个技巧让你的ChatGPT对话分享更受欢迎 ShareGPT是一个开源的一键分享工具让你可以轻松地将ChatGPT对话生成永久链接Cushy主题与样式实战从暗色模式切换到OKLab色彩方案编辑器手把手教程Cushy主题与样式实战从暗色模式切换到OKLab色彩方案编辑器手把手教程 Cushy 是一个实验性的跨平台 Rust GUI crate它的主题系统让你只上一篇腾讯混元0.5B轻量模型双思维推理256K上下文新体验下一篇OptiScaler 错误排查4 步定位黑屏、花屏与帧率下降创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
动态生成 PDF 时如何优雅实现“第 x 页 共 y 页”的页码效果? 在使用 iTextSharp 导出 PDF 文件时,产品需求定义页脚显示类似 “第 x 页 共 y 页” 的格式。然而,当 PDF 内容包含大量动态元素(如可变行数的表格、不确定长度的文本等)时,在生成过程中无法提前获知总页数,… · 2026/9/24 15:27:25
葡萄牙语翻译怎么选?真正麻烦的是巴西葡语和欧洲葡语根本不完全一样 很多人第一次用葡萄牙语翻译软件时,会直接在语言列表里选择Portuguese。这个选择看起来很简单,真正用起来以后,很快就会遇到一个问题:你面对的到底是巴西葡萄牙语,还是欧洲葡萄牙语?两种变体可以互相理解&a… · 2026/9/24 15:27:19
Qt — 容器类控件 目录
1. Group Box
2. Table Widget 容器类控件:容器里面还可以容纳一些其它的控件
多元素控件:包含的内容,是一个一个的自定义好的 “Item”对象
容器类控件,包含的内容是前面已经讲述过的各种控件了,QPushButton… · 2026/9/24 15:27:12
Phoenix LDAP 认证安全深度剖析:从威胁模型到生产级防护实现 Phoenix LDAP 认证安全深度剖析:从威胁模型到生产级防护实现 【免费下载链接】phoenix AI Observability & Evaluation 项目地址: https://gitcode.com/gh_mirrors/phoenix13/phoenix
导读
本文以 Phoenix(AI Observability & Evaluatio… · 2026/9/24 16:05:27
ESP-IDF Windows 安装实战:EIM 装好环境,hello_world 一次跑通 ESP-IDF Windows 安装实战:EIM 装好环境,hello_world 一次跑通 【免费下载链接】esp-idf Espressif IoT Development Framework. Official development framework for Espressif SoCs. 项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf … · 2026/9/24 16:05:27
从 Chat 到 Agent,2026 年到底变了什么? 一、先说结论:变的不是模型,是"它有没有闭环"
咱们先把 Chat 那套老逻辑捋一遍。你给它一段话,它还你一段话,单次前向推理,无状态、无副作用。说白了就是个"嘴替",说完就完了。
它的天… · 2026/9/24 16:05:13
webnovel-writer 冲突设计实战:5 步把网文冲突引擎铺进卷纲 webnovel-writer 冲突设计实战:5 步把网文冲突引擎铺进卷纲 【免费下载链接】webnovel-writer 基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200 万字量级 连载创作。 项目地址: https://gitcode… · 2026/9/24 16:05:07
Accelerate 模型量化实战:基于 bitsandbytes 的 8-bit / 4-bit 模型加载与推理 人工智能深度学习分布式训练 【免费下载链接】accelerate 🚀 A simple way to launch, train, and use PyTorch models on almost any device and distributed configuration, automatic mixed precision (including fp8), and easy-to-configure FSDP and DeepSpee… · 2026/9/24 16:05:07
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44