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解碼為指定類型的單一對象。觸發前提:
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深入学习(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ribbon源码解析(二)
- 下一篇: Feign深入学习(一)