跳到主要内容

【11】Feign 编码解码器Encoder和Decoder源码分析

文章目录

  • 概述
  • 接口及相关实现类
    • Encoder 接口
  • Decoder接口
  • 执行流程源码分析
      1. 项目结构改造
    1. 编码器流程
    1. 解码器流程
    1. 异常解码处理流程
    1. 404异常特殊处理
  • 自定义编码解码器

概述

在现实世界,编解码的概念就存在了。编码是信息从一种形式或格式转换为另一种形式的过程,解码,是编码的逆过程。在电子计算机、电视、遥控和通讯等方面广泛使用。

在程序中,也是广泛使用了这个概念,比如Base64 编码解码。

Feign中,也存在编解码的概念:

  • Encoder :编码器,作用于请求阶段,将对象编码到请求体中。
  • Decoder:解码器,作用域响应阶段,解析HTTP 响应消息。

接口及相关实现类

Encoder 接口

Encoder接口声明了一个编码方法,并提供了一个默认的实现类Default

Default编码器,它仅能处理String类型、[byte]类型,显然是很难使用的,因为我们经常会在请求参数中放入对象。

public interface Encoder {



Type MAP_STRING_WILDCARD = Util.MAP_STRING_WILDCARD;

// 编码
// var1=》 要编码的对象
// var2 =》 对象类型
// var3 =》 请求模板对象
void encode(Object var1, Type var2, RequestTemplate var3) throws EncodeException;

public static class Default implements Encoder {


public Default() {


}
public void encode(Object object, Type bodyType, RequestTemplate template) {


// String类型,直接调用toString(),并设置到请求模板的body 中
if (bodyType == String.class) {


template.body(object.toString());
// 二进制,塞入二进制
} else if (bodyType == byte[].class) {


template.body((byte[])((byte[])object), (Charset)null);
} else if (object != null) {


// 不是NULL ,爆出编码异常
throw new EncodeException(String.format("%s is not a type supported by this encoder.", object.getClass()));
}

}
}
}