日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Feign深入学习(二)

發布時間:2024/4/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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深入学习(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。