前言:最近在做某些功能的時候需要使用到別的公司的服務,並請求他們提供的接口,已經有很多成熟的HTTP請求框架,比如apache的httpClient包,非常優秀的Okhttp,spring提供的RestTemplate,接口很多的情況下在使用時會發現所有的接口需要寫大量的http請求配置信息,申明請求體,返回類型,請求參數,請求頭,然后再寫業務代碼時可讀性降低,http請求的代碼和業務代碼解耦增加,所以找到一款可以方便調用接口的框架——Forest,他只是在原有基礎上重復造輪子,實際上是調用接口時干臟活累活的一個實現類, 方便請求和管理大量的HTTP請求信息。
一、官網
http://forest.dtflyx.com/docs/
二、介紹
Forest 是一個開源的 Java HTTP 客戶端框架,它能夠將 HTTP 的所有請求信息(包括 URL、Header 以及 Body 等信息)綁定到您自定義的 Interface 方法上,能夠通過調用本地接口方法的方式發送 HTTP 請求。
使用Forest的優點:
- 以
Httpclient
和OkHttp
為后端框架 - 通過調用本地方法的方式去發送Http請求, 實現了業務邏輯與Http協議之間的解耦
- 相比Feign更輕量,不依賴
Spring Cloud
和任何注冊中心 (Feign) - 支持所有請求方法:
GET
,HEAD
,OPTIONS
,TRACE
,POST
,DELETE
,PUT
,PATCH
- 支持靈活的模板表達式
- 支持過濾器來過濾傳入的數據
- 基於注解、配置化的方式定義
Http
請求 - 支持
Spring
和Springboot
集成 - 實現
JSON
和XML
的序列化和反序列化 - 支持JSON轉換框架:
Fastjson
,Jackson
,Gson
- 支持
JAXB
形式的XML
轉換 - 支持
SSL
的單向和雙向加密 - 支持http連接池的設定
- 可以通過
OnSuccess
和OnError
接口參數實現請求結果的回調 - 配置簡單,一般只需要
@Request
一個注解就能完成絕大多數請求的定義 - 支持異步請求調用
三、使用
1.安裝
截至目前最新版本為1.5.2,只需在項目中導入下面依賴即可
<dependency> <groupId>com.dtflys.forest</groupId> <artifactId>forest-spring-boot-starter</artifactId> <version>1.5.2-BETA</version> </dependency>
2.進行Forest簡單配置
forest支持okhttp3和httpclient,默認為okhttp
forest: bean-id: config0 # 在spring上下文中bean的id, 默認值為forestConfiguration backend: okhttp3 # 后端HTTP API: okhttp3 max-connections: 1000 # 連接池最大連接數,默認值為500 max-route-connections: 500 # 每個路由的最大連接數,默認值為500 timeout: 3000 # 請求超時時間,單位為毫秒, 默認值為3000 connect-timeout: 3000 # 連接超時時間,單位為毫秒, 默認值為2000 retry-count: 1 # 請求失敗后重試次數,默認為0次不重試 ssl-protocol: SSLv3 # 單向驗證的HTTPS的默認SSL協議,默認為SSLv3 logEnabled: true # 打開或關閉日志,默認為true log-request: true # 打開/關閉Forest請求日志(默認為 true) log-response-status: true # 打開/關閉Forest響應狀態日志(默認為 true) log-response-content: true # 打開/關閉Forest響應內容日志(默認為 false)
3.接口調用
可以新建一個接口類來專門寫第三方的接口調用,類似這樣
請求方法支持GET、POST 、PUT 、HEAD OPTIONS、 DELETE
只需要在請求接口類上加上注解,這里以get請求方法為例
可以在接口上加注解@GetRequest("/xx") 或者 @Get("/xx") 或者@Request(type = "GET", url = "/xx") (這里type里get或GET不區分大小寫)這三個注解的效果等同,注解只能在方法上
當請求的所以接口都有相同的屬性或者在@Request里重復定義的內容時,可以在接口類上加上注解@BaseRequest,他配置的信息將會分配到每一個接口上,
這里申明的屬性值優先級關系為 方法體上面注解@Request > 類申明注解@BaseRequest > application.yml
調用的時候只需要在sping中注入你寫 的接口,像調用本地方法一樣調用里面的接口方法
最后:
Forest
有很多其他的功能設定,可以類似RPC框架Feign,dubbo這些,只需要我們定義訪問的接口,進行調用,而不用關注請求時的細節;同時實現了接口代碼和業務代碼的解耦,Forest和Feign在使用和配置上確實很相像,但Feign
的角色更多是作為Spring Cloud
生態里的一個成員。充當RPC通信的角色,其承擔的不僅是http通訊,還要對注冊中心下發的調用地址進行負載均衡。但是像請求第三方接口使用Forest絕對可以達到事半功倍的效果。