Feign深入学习(二)
编码器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
解码为指定类型的单一对象。触发前提:
- 响应码是2xx。(OK)
- 方法返回值既不是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深入学习(二)相关推荐
- Elasticsearch 学习(二).实战使用
Elasticsearch 学习(二).实战使用 参考:http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/15.Elastic ...
- C#多线程学习(二) 如何操纵一个线程
C#多线程学习(二) 如何操纵一个线程 原文链接:http://kb.cnblogs.com/page/42529/ [1] C#多线程学习(二) 如何操纵一个线程 [2] C#多线程学习(二) 如何 ...
- spring security 学习二
spring security 学习二 doc:https://docs.spring.io/spring-security/site/docs/ 基于表单的认证(个性化认证流程): 一.自定义登录页 ...
- STL源码剖析学习二:空间配置器(allocator)
STL源码剖析学习二:空间配置器(allocator) 标准接口: vlaue_type pointer const_pointer reference const_reference size_ty ...
- mysql用创建的用户登陆并修改表格_MySQL 基础学习二:创建一个用户表,并增删改查...
MySQL 基础学习二:创建一个用户表,并 增删改查 提示:MySQL 命令建议都用大写,因为小写运行时,还是翻译成大写的. 第一步,创建一个用户表 1,打开控制台,进入数据库 C:\Users\Ad ...
- OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack()
OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack() 参考博客: Harris角点检测原理详解 Harri ...
- OpenCV学习(二十二) :反向投影:calcBackProject(),mixChannels()
OpenCV学习(二十二) :反向投影:calcHist(),minMaxLoc(),compareHist() 参考博客: 反向投影backproject的直观理解 opencv 反向投影 颜色直方 ...
- OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats()
OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats() 1.connectedComponents() ...
- OpenCV学习(二十) :分水岭算法:watershed()
OpenCV学习(二十) :分水岭算法:watershed() 参考博客: OpenCV-分水岭算法 图像处理--分水岭算法 OpenCV学习(7) 分水岭算法(1) Opencv分水岭算法--wat ...
- OpenCV与图像处理学习二——图像直方图与色彩空间
OpenCV与图像处理学习二--图像直方图与色彩空间 2.4 图像直方图(Image Histogram) 2.4.1 直方图的绘制 2.4.2 三通道直方图绘制 2.5 颜色空间 2.5.1 RGB ...
最新文章
- 学计算机高考英语听力考试时间,北京高考英语听力考试时间
- java 控制台刷屏 dll_控制台被警告刷屏 · Issue #IXD8V · 卓源软件/JeeSite 4.2 - Gitee.com...
- 【剑指offer】Q38:数字在数组中出现的次数
- 【待继续研究】如何运用机器学习技术构建可行的反欺诈检测方案?
- SharePoint 2013 图文开发系列之WebPart
- mysql innodb表移植_mysql Innodb引擎独立表空间下通过复制.ibd文件快速迁移数据文件...
- 戴尔游匣7559经常(大概半小时)断电,关机的解决办法
- 使用Python爬虫爬取网络美女图片
- 图像识别讲解 以一个简单的图像识别任务为例
- 程序员,都是内卷之王!
- Matplotlib画热力图---heatmap(逐行注释)
- GB/T28181之国标编码一览表,需要自取
- Object.freeze()
- Window.clearTimeout() 方法取消由 setTimeout() 方法设置的 timeout
- 计算机考研高数试卷答案,考研数学试卷大全(全国各高校历年试卷)
- C-Boxes packing
- 新商用密码产品认证梳理——政策法规篇
- 【财富空间】65张PPT把工匠精神说清楚
- 九齐单片机应用-小家电开发(1)
- ssh备考-03hibernate各种查询方式