编码器Encoder

编码器将对象编码到HTTP请求体中。当方法参数没有标注@Param注解时,编码器会起作用。不给参数标注@Param注解,就可以通过Encoder编码器把POJO编码进Body体里(如果需要JSON格式,可以借助JSON库)

public interface Encoder {// 变量输入到Map<String, ?>,表示要编码的对象是一个表单Type MAP_STRING_WILDCARD = Util.MAP_STRING_WILDCARD;// 唯一接口方法:object 需要被编码的对象(有可能是POJO,有可能是字符串)// bodyType:body类型// template:请求模版void encode(Object object, Type bodyType, RequestTemplate template) throws EncodeException;
}

如果方法参数并没有被模版使用,那么他会被收集放到一个Map里,然后交给Encoder处理。

@RequestLine("POST /")
Session login(@Param("username") String username, @Param("password") String password);

#这里的username和password均没有被@RequestLine使用到,所以它会被收集起放进一个Map里(LinkedHashMap)交给编码器处理。

bodyType是方法参数的静态类型,而不是对象的运行时类型。

Default

Feign内置的唯一编码器实现,也就是缺省实现。

  class Default implements Encoder {@Overridepublic void encode(Object object, Type bodyType, RequestTemplate template) {if (bodyType == String.class) {template.body(object.toString());} else if (bodyType == byte[].class) {template.body((byte[]) object, null);} else if (object != null) {throw new EncodeException(format("%s is not a type supported by this encoder.", object.getClass()));}}}

它仅能处理String类型、byte[]类型

自定义编码器

Feign.builder().encoder(new MyEncoder())

QueryMapEncoder

QueryMapEncoder负责将对象编码为Map查询参数名到值的映射。

public interface QueryMapEncoder {Map<String, Object> encode(Object object);}

BeanQueryMapEncoder

查询映射将使用POJO 可访问 (public)的getter属性方法最后作为查询参数拼接上去,拼接的顺序并不保证,如果某个属性为null,将不会拼接。

解码器Decoder

将HTTP响应feign.Response解码为指定类型的单一对象。触发前提:

  1. 响应码是2xx。(OK)
  2. 方法返回值既不是void/null,也不是feign.Response类型
public interface Decoder {// response:代表请求响应// type:代表方法的返回值类型// 它还有个特点:抛出了三种异常// 但其实除了IOException,其它两种都是unchecked异常Object decode(Response response, Type type) throws IOException, DecodeException, FeignException;
}

StreamDecoder

支持返回值是java.util.stream.Stream类型,但是它依赖于一个iteratorDecoder来实现。iteratorDecoder它负责实际的解码动作:Iterator<?> iterator = (Iterator) iteratorDecoder.decode(...),最终解码出来的必须是个Iterator类型,比如List。

OptionalDecoder

支持Java8的java.util.Optional

StringDecoder

顾名思义,值处理返回值类型String类型的方法。仅处理String类型:把body流转换为String。

Util.toString(body.asReader());

Default

顾名思义:它是Feign默认使用的解码器。它继承自StringDecoder,所以也仅只能解码为字符串类型,支持转换为byte[]。

      if (byte[].class.equals(type)) {return Util.toByteArray(response.body().asInputStream());}

ErrorDecoder

发生错误、异常情况时使用的解码器,允许对异常进行特殊处理。通常情况下404在Http响应码中具有较强语义的,因此默认情况下它是抛出异常,若开启decode404,那么它交给的是Decoder去完成,而非ErrorDecoder。

Feign深入学习(二)相关推荐

  1. Elasticsearch 学习(二).实战使用

    Elasticsearch 学习(二).实战使用 参考:http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/15.Elastic ...

  2. C#多线程学习(二) 如何操纵一个线程

    C#多线程学习(二) 如何操纵一个线程 原文链接:http://kb.cnblogs.com/page/42529/ [1] C#多线程学习(二) 如何操纵一个线程 [2] C#多线程学习(二) 如何 ...

  3. spring security 学习二

    spring security 学习二 doc:https://docs.spring.io/spring-security/site/docs/ 基于表单的认证(个性化认证流程): 一.自定义登录页 ...

  4. STL源码剖析学习二:空间配置器(allocator)

    STL源码剖析学习二:空间配置器(allocator) 标准接口: vlaue_type pointer const_pointer reference const_reference size_ty ...

  5. mysql用创建的用户登陆并修改表格_MySQL 基础学习二:创建一个用户表,并增删改查...

    MySQL 基础学习二:创建一个用户表,并 增删改查 提示:MySQL 命令建议都用大写,因为小写运行时,还是翻译成大写的. 第一步,创建一个用户表 1,打开控制台,进入数据库 C:\Users\Ad ...

  6. OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack()

    OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack() 参考博客: Harris角点检测原理详解 Harri ...

  7. OpenCV学习(二十二) :反向投影:calcBackProject(),mixChannels()

    OpenCV学习(二十二) :反向投影:calcHist(),minMaxLoc(),compareHist() 参考博客: 反向投影backproject的直观理解 opencv 反向投影 颜色直方 ...

  8. OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats()

    OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats() 1.connectedComponents() ...

  9. OpenCV学习(二十) :分水岭算法:watershed()

    OpenCV学习(二十) :分水岭算法:watershed() 参考博客: OpenCV-分水岭算法 图像处理--分水岭算法 OpenCV学习(7) 分水岭算法(1) Opencv分水岭算法--wat ...

  10. OpenCV与图像处理学习二——图像直方图与色彩空间

    OpenCV与图像处理学习二--图像直方图与色彩空间 2.4 图像直方图(Image Histogram) 2.4.1 直方图的绘制 2.4.2 三通道直方图绘制 2.5 颜色空间 2.5.1 RGB ...

最新文章

  1. 学计算机高考英语听力考试时间,北京高考英语听力考试时间
  2. java 控制台刷屏 dll_控制台被警告刷屏 · Issue #IXD8V · 卓源软件/JeeSite 4.2 - Gitee.com...
  3. 【剑指offer】Q38:数字在数组中出现的次数
  4. 【待继续研究】如何运用机器学习技术构建可行的反欺诈检测方案?
  5. SharePoint 2013 图文开发系列之WebPart
  6. mysql innodb表移植_mysql Innodb引擎独立表空间下通过复制.ibd文件快速迁移数据文件...
  7. 戴尔游匣7559经常(大概半小时)断电,关机的解决办法
  8. 使用Python爬虫爬取网络美女图片
  9. 图像识别讲解 以一个简单的图像识别任务为例
  10. 程序员,都是内卷之王!
  11. Matplotlib画热力图---heatmap(逐行注释)
  12. GB/T28181之国标编码一览表,需要自取
  13. Object.freeze()
  14. Window.clearTimeout() 方法取消由 setTimeout() 方法设置的 timeout
  15. 计算机考研高数试卷答案,考研数学试卷大全(全国各高校历年试卷)
  16. C-Boxes packing
  17. 新商用密码产品认证梳理——政策法规篇
  18. 【财富空间】65张PPT把工匠精神说清楚
  19. 九齐单片机应用-小家电开发(1)
  20. ssh备考-03hibernate各种查询方式

热门文章

  1. 在Editplus中搭建Ruby开发环境
  2. imx8m开发板资料
  3. 现代中小企业IT基础平台建设 - 完整案例实战(00_序)
  4. 021:自定义path(或url)转换器
  5. Vue.js学习笔记四
  6. HTML 5 Canvas 参考手册
  7. Interleaving String
  8. oracle 10 TNSLSNR.EXE 占用了8080端口怎么办
  9. springboot热部署工具
  10. redis 都有哪些数据类型?分别在哪些场景下使用比较合适?