# feign-test **Repository Path**: lisinian/feign-test ## Basic Information - **Project Name**: feign-test - **Description**: Feign 自定义拦截器、编码器、解码器 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 2 - **Created**: 2020-10-13 - **Last Updated**: 2022-07-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 建议先看下我的博客,了解下项目整体设计:https://blog.csdn.net/MariaOzawa/article/details/109133593 # Feign 自定义拦截器、编码器、解码器 ## Feign 统一请求拦截器 ### 主要类 `feign.RequestInterceptor` : feign提供的扩展接口,用来实现对 feign http 请求的拦截。 本项目中自定义实现类: `CustomFeignRequestInterceptor` : 展示了统一为 feign 添加 http 头信息, 以及修改/替换请求体中的内容。 ### 应用场景 1. 有些服务需要在 `header `中统一添加鉴权信息,可以交给拦截器统一处理; 2. 有些服务不支持 json 格式的请求,但是我们又想要 feign 声明式接口的这种易读性,我的做法就是在 `RequestInterceptor `把 http body 转成第三方想要的格式,之后再去做请求。 > 以我工作中写的业务为例,请求第三方短信需要在`header`中统一添加appId认证。 > 并且该第三方不接受正常的 json 格式,需要将 json 作 AES 加密后放入到http body 体中, > 但是我又想要调用 feign 接口时只放入一个我封装的 entity 对象就行,这样看上去比较易读。 > 我就会选择在 `RequestInterceptor `中拿到 body 体,对其作加密处理后重放进 body 体中再去调用第三方。 ### 测试 启动本项目后,找到 test 目录下 `com.example.feigntest.coustomconfig.TestRequestInterceptor` 相关方法之后运行观察日志即可。 ## Feign 编码器 ### 主要类 `feign.codec.Encoder` : feign 提供的接口,用来将 feign 接口接收的参数编码成请求体。 ### 本项目中自定义实现类: `CustomFeignEncoder` : 展示了怎样修改 encoder 的默认逻辑及各个参数的含义。 ### 应用场景 1. 比如有些第三方要接收 xml 格式的请求体,可以自定义 encoder 替换掉 feign 默认的编码器。 ### 测试 启动本项目后,找到 test 目录下 `com.example.feigntest.coustomconfig.TestEncoder` 相关方法之后运行观察日志即可。 ## Feign 解码器 ### 主要类 `feign.codec.Decoder` : feign 提供的接口,用来将 http response 解码成 feign 接口定义的返回类型。 ### 本项目中自定义实现类: CustomFeignDecoder : 展示了将第三方返回的不规则的 http body, 转换成我们自定义的实体类。 ### 应用场景 比如我先项目中用到的场景,某第三方返回 http body 格式如下: “success:15348138464864” or "error:errCode", 然后我的 feign 接口定义是 `public SmsResponse send();` ```java SmsResponse{ private boolean success; private String serialNumber; private String errCode; } ``` 此时我就需要自定义 decoder 解码,将该字符串按照我的规则转成 SmsResponse 实体类。 ### 测试 启动本项目后,找到 test 目录下 `com.example.feigntest.coustomconfig.TestDecoder` 相关方法之后运行观察日志即可。 ## Feign中这三个组件的执行顺序 Encoder -> RequestInterceptor -> 发起 http 调用 -> 返回 http response -> Decoder