一、自定义 Encoder/Decoder

feign-en-de-code.7z

1.1、需求

需求:第三方 API 调用使用 Feign 发起调用,请求和响应有如下要求

  • 请求:需要两个参数:
    参数1:把所有入参按照一定格式排序,然后加密成一个字符串
    参数2:验签
  • 响应:响应参数进行对象映射

功能

  • Encoder :完成请求参数的加密和验签的处理
  • Decoder:完成响应结果的解析,并映射成对象

    1.2、案例项目结构

    image.png

  • comsumer 发起 API 请求调用

  • provider 模拟第三方 API 请求

    1.2、请求APIimage.png

  • 发起 API 请求参数:UserInfo 对象
    image.png

  • 接收响应的对象:MyResponse 对象,对应两个字段:status 和 response
    image.png

    1.3、模拟第三方API代码image.png

  • 接收参数:sign 和 requestXml
    image.png

  • 响应结果:CommonResponse 对象,对应两个字段:status 和 response

    1.3、Encoder 实现

    第三方 API 和我们发起 API的组装参数不一样,所以需要通过 Encoder 将我们的入参统一封装成 第三方 API 需要的入参

关键代码实现如下:(文件路径:com.zhixing.feign.encoding.MySelfEncoder)
image.png
主要逻辑:
根据第三方API的格式,和要求,对我们的入参(这里是User Info对象)进行处理,重新组装符合第三方API要求的入参。

1.4、Decoder 实现

第三方 API 返回的响应主要是两个字段:status 和 response ,这两个字段以 JSON 的格式返回
如:

  1. {
  2. "status": 200,
  3. "response":"响应结果"
  4. }

我们程序的接收需要,根据响应进行接收

Decode 相关实现关键代码如下:(包路径:com.zhixing.feign.encoding.MySelfDecode)
image.png
Decoder 的处理,根据程序接收对象分为三种

  • 字符串接收
    直接交给 SpringDecoder 处理(默认使用 HttpMessageConverters 处理)
  • Response 对象接收
    直接返回 Response 对象
  • 自定义对象接收
    从 Response 获取 Body ,也就是 JSON 字符,然后将 JSON 转换成 对象,直接进行返回