[享学Feign] 七、请求模版对象RequestTemplate和标准请求对象feign.Request

本文详细介绍了Feign的RequestTemplate,包括源码解析、Factory的实现,如BuildTemplateByResolvingArgs、BuildEncodedTemplateFromArgs、BuildFormEncodedTemplateFromArgs。同时,讲解了feign.Request对象,特别是Body的处理。RequestTemplate负责模版的解析和组装,最终转换为不可变的feign.Request对象。

你现在没有决定的权利,但你有决定未来的权利

–> 返回Netflix OSS套件专栏汇总 <–
代码下载地址:https://github.com/f641385712/feign-learning

前言

通过前几篇文章,能够发现有个对象我们会频繁打交道,它就是Feign的请求模版对象RequestTemplate

feign.template.Template以及它的4个子模版都已经了解过了,体会到了模版设计的高扩展性和高弹性。而此处的RequestTemplate稍有不同,可以理解它是一个聚合,聚合有多种模版、参数、值从而提供转向标准请求对象feign.Request的能力。


正文

我们知道一个简单的实例方法RequestTemplate#request()就完成了模版对标准请求对象的转换,那么在它之前、之中、之后都做了什么呢?


在使用 Feign Jackson 发起 POST 请求时,若希望在请求行(request line)中传递参数,可以通过 Feign 的 URI 模板功能实现。Feign 支持在注解中定义 URI 路径参数,这些参数会通过 `RequestTemplate` 替换为实际值,形成完整的请求路径 [^1]。 ### 使用 URI 模板传递请求行参数 Feign 提供了 `@PostMapping` 注解用于定义 POST 请求,同时支持在 URL 路径中嵌入变量。这些变量会在请求构建时被替换为实际的参数值。例如: ```java @FeignClient(name = "service-provider") public interface ExampleFeignClient { @PostMapping("/api/v1/create/{name}/{value}") ResponseEntity<String> createData(@PathVariable("name") String name, @PathVariable("value") int value); } ``` 在该接口中,`{name}` `{value}` 是 URI 模板变量,Feign 会通过 `@PathVariable` 注解将方法参数注入到请求 URL 中。这种方式适用于将参数直接编码在 URL 中的场景 [^1]。 ### 结合请求体与路径参数 如果需要在 POST 请求中同时使用请求路径参数,可以将 `@RequestBody` 与 `@PathVariable` 混合使用: ```java @FeignClient(name = "service-provider") public interface ExampleFeignClient { @PostMapping("/api/v1/create/{name}") ResponseEntity<String> createData(@PathVariable("name") String name, @RequestBody ExampleRequest request); } ``` 该接口在 `/api/v1/create/{name}` 路径中使用了路径参数 `name`,并接收一个 JSON 格式的请求体 `ExampleRequest`。Jackson 会自动将对象序列化为 JSON 格式并作为请求体发送 [^1]。 ### 配置 Feign 客户端以支持 Jackson 为了确保 Feign 能够正确地序列化反序列化 JSON 数据,需配置 Jackson 作为默认的消息转换器: ```java @Configuration public class FeignConfig { @Bean public Encoder feignEncoder() { return new SpringEncoder(() -> new MappingJackson2HttpMessageConverter()); } } ``` 该配置确保 Feign 使用 Jackson 处理 HTTP 请求体的序列化,从而支持复杂的 Java 对象传输 [^1]。 --- ### 示例数据类 ```java public class ExampleRequest { private String description; private boolean active; // Getters and Setters } ``` 在调用时,Feign 会将 `ExampleRequest` 实例序列化为 JSON,并作为 POST 请求body 发送,同时将 `name` 参数插入到 URL 中 [^1]。 --- ### 总结 通过 URI 模板 `@PathVariable`,Feign 支持在请求行中传递参数,同时结合 Jackson 可以实现复杂的请求体序列化。这种机制适用于需要在 URL 中嵌入标识符(如资源 ID)并同时发送结构化数据的场景。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值