一款直擊痛點的優(yōu)秀http框架,讓我超高效率完成了和第三方接口的對接
閱讀本文大概需要 6 分鐘。
來自:元人部落
1.背景
RESTFUL規(guī)范,有的基于傳統(tǒng)的http規(guī)范;有的需要在header里放置簽名,有的需要SSL的雙向認證,有的只需要SSL的單向認證;有的以JSON?方式進行序列化,有的以XML方式進行序列化。類似于這樣細節(jié)的差別太多了。apache的httpClient包,非常優(yōu)秀的Okhttp,jersey client。http開源框架的接口使用相對來說,都不太一樣。不管選哪個,在我這個場景里來說,我都不希望在調(diào)用每個第三方的http api時寫上一堆http調(diào)用代碼。https://gitee.com/dt_flys/forest

2.上手
Forest支持了Springboot的自動裝配,所以只需要引入一個依賴就行<dependency>
??<groupId>com.dtflys.forestgroupId>
??<artifactId>spring-boot-starter-forestartifactId>
??<version>1.3.0version>
dependency>
public?interface?MyClient?{
????@Request(url?=?"http://baidu.com")
????String?simpleRequest();
????@Request(
????????????url?=?"http://ditu.amap.com/service/regeo",
????????????dataType?=?"json"
????)
????Map?getLocation(@DataParam("longitude")?String?longitude,?@DataParam("latitude")?String?latitude);
??
}
@SpringBootApplication
@ForestScan(basePackages?=?"com.example.demo.forest")
public?class?DemoApplication?{
????public?static?void?main(String[]?args)?{
????????SpringApplication.run(DemoApplication.class,?args);
????}
}
@Autowired
private?MyClient?myClient;
@Override
public?void?yourMethod?throws?Exception?{
????Map?result?=?myClient.getLocation("124.730329","31.463683");
????System.out.println(JSON.toJSONString(result,true));
}
Forest打印了內(nèi)部所用的http框架,和實際請求url和返回。當(dāng)然日志可以通過配置去控制開關(guān)。
3.特點
Forest?底層封裝了2種不同的http框架:Apache httpClient和OKhttp。所以這個開源框架并沒有對底層實現(xiàn)進行重復(fù)造輪子,而是在易用性上面下足了功夫。Forest最終完成了和多個服務(wù)商api對接的項目,這些風(fēng)格迥異的API,我僅用了1個小時時間就把他們轉(zhuǎn)化為了本地方法。然后項目順利上線。Forest作為一款更加高層的http框架,其實你并不需要寫很多代碼,大多數(shù)時候,你僅通過一些配置就能完成http的本地化調(diào)用。而這個框架所能覆蓋的面,卻非常之廣,滿足你絕大多數(shù)的http調(diào)用請求。Forest有以下特點:以 Httpclient和OkHttp為后端框架通過調(diào)用本地方法的方式去發(fā)送Http請求, 實現(xiàn)了業(yè)務(wù)邏輯與Http協(xié)議之間的解耦 相比Feign更輕量,不依賴 Spring Cloud和任何注冊中心支持所有請求方法: GET,?HEAD,?OPTIONS,?TRACE,?POST,?DELETE,?PUT,?PATCH支持靈活的模板表達式 支持過濾器來過濾傳入的數(shù)據(jù) 基于注解、配置化的方式定義 Http請求支持 Spring和Springboot集成實現(xiàn) JSON和XML的序列化和反序列化支持JSON轉(zhuǎn)換框架:? Fastjson,Jackson,?Gson支持 JAXB形式的XML轉(zhuǎn)換支持 SSL的單向和雙向加密支持http連接池的設(shè)定 可以通過 OnSuccess和OnError接口參數(shù)實現(xiàn)請求結(jié)果的回調(diào)配置簡單,一般只需要 @Request一個注解就能完成絕大多數(shù)請求的定義支持異步請求調(diào)用
4.兩個很棒的功能
https://dt_flys.gitee.io/forest
4.1?模板表達式和參數(shù)的映射綁定功能
@Request(
????url?=?"${0}/send?un=${1}&pw=${2}&ph=${3}&ct=${4}",
????type?=?"get",
????dataType?=?"json"
)
public?Map?send(
????String?base,
????String?userName,
????String?password,
????String?phone,
????String?content
);
@Request(
????url?=?"${base}/send?un=${un}&pw=${pw}&ph=${3}&ct=${ct}",
????type?=?"get",
????dataType?=?"json"
)
public?Map?send(
????@DataVariable("base")?String?base,
????@DataVariable("un")?String?userName,
????@DataVariable("pw")?String?password,
????@DataVariable("ph")?String?phone,
????@DataVariable("ct")?String?content
);
@Request(
????url?=?"${base}/send",
????type?=?"get",
????dataType?=?"json"
)
public?Map?send(
????@DataVariable("base")?String?base,
????@DataParam("un")?String?userName,
????@DataParam("pw")?String?password,
????@DataParam("ph")?String?phone,
????@DataParam("ct")?String?content
);
@Request(
????url?=?"${base}/pay",
???contentType?=?"application/json",
????type?=?"post",
????dataType?=?"json",
????headers?=?{"Authorization:?${1}"},
????data?=?"${json($0)}"
)
public?PayResponse?pay(PayRequest?request,?String?auth);
4.2 對HTTPS的支持
Forest對于這方面也想的很周到,底層完美封裝了對https單雙向證書的支持。也是只要通過簡單的配置就能迅速完成。舉個雙向證書栗子:@Request(
????url?=?"${base}/pay",
???contentType?=?"application/json",
????type?=?"post",
????dataType?=?"json",
???keyStore?=?"pay-keystore",
???data?=?"${json($0)}"
)
public?PayResponse?pay(PayRequest?request);
pay-keystore對應(yīng)著application.yml里的ssl-key-storesforest:
??...
??ssl-key-stores:
????-?id:?pay-keystore
??????file:?test.keystore
??????keystore-pass:?123456
??????cert-pass:?123456
??????protocols:?SSLv3
5.最后
Forest有很多其他的功能設(shè)定,如果感興趣的同學(xué)還請仔細去閱讀文檔和示例。Feign嗎?Spring Cloud項目的時候,也用過一段時間Feign,個人感覺Forest的確在配置和用法上和Feign的設(shè)計很像,但Feign的角色更多是作為Spring Cloud生態(tài)里的一個成員。充當(dāng)RPC通信的角色,其承擔(dān)的不僅是http通訊,還要對注冊中心下發(fā)的調(diào)用地址進行負載均衡。Forest這個開源項目其定位則是一個高階的http工具,主打友好和易用性。從使用角度出發(fā),個人感覺Forest配置性更加簡單直接。提供的很多功能也能解決很多人的痛點。Forest推薦閱讀:
高中生寫LOL外掛1年狂賺500萬,落網(wǎng)前剛買下120萬保時捷...
微信掃描二維碼,關(guān)注我的公眾號
朕已閱?
評論
圖片
表情

