<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一款直擊痛點(diǎn)的優(yōu)秀http框架,讓我超高效完成了第三方接口的對(duì)接

          共 5143字,需瀏覽 11分鐘

           ·

          2020-08-10 21:38

          鏈接:www.cnblogs.com/bryan31/p/13359376.html

          1. 背景

          因?yàn)闃I(yè)務(wù)關(guān)系,要和許多不同第三方公司進(jìn)行對(duì)接。這些服務(wù)商都提供基于 http 的 api。但是每家公司提供 api 具體細(xì)節(jié)差別很大。有的基于 RESTFUL 規(guī)范,有的基于傳統(tǒng)的 http 規(guī)范;有的需要再 header 里放置簽名,有的需要 SSL 的雙向認(rèn)證,有的只需要 SSL 的單向認(rèn)證;有的以 JSON 方式進(jìn)行序列化,有的以 XML 方式進(jìn)行序列化。類似于這樣細(xì)節(jié)的差別太多了。

          不同的公司 API 規(guī)范不一樣,這很正常。但是對(duì)于我來(lái)說(shuō),我如果想要代碼變得優(yōu)雅。我就必須解決一個(gè)痛點(diǎn):

          不同服務(wù)商 API 那么多的差異點(diǎn),如何才能維護(hù)一套不涉及業(yè)務(wù)的公共 http 調(diào)用套件。最好通過(guò)配置或者簡(jiǎn)單的參數(shù)就能區(qū)分開(kāi)來(lái)。進(jìn)行方便的調(diào)用?

          我當(dāng)然知道有很多優(yōu)秀的大名鼎鼎的 http 開(kāi)源框架可以實(shí)現(xiàn)任何形式的 http 調(diào)用,在多年的開(kāi)發(fā)經(jīng)驗(yàn)中我都有使用過(guò)。比如 apache 的 httpClient 包,非常優(yōu)秀的 Okhttp,jersey client。

          這些 http 開(kāi)源框架的接口使用相對(duì)來(lái)說(shuō),都不太一樣。不管選哪個(gè),在我這個(gè)場(chǎng)景里來(lái)說(shuō),我都不希望在調(diào)用每個(gè)第三方的 http api 時(shí)寫(xiě)上一堆 http 調(diào)用代碼。

          所以,在這個(gè)場(chǎng)景里,我得對(duì)每種不同的 http api 進(jìn)行封裝。這樣的代碼才能更加優(yōu)雅,業(yè)務(wù)代碼和 http 調(diào)用邏輯耦合度更低。

          可惜,我比較懶。一來(lái)覺(jué)得封裝起來(lái)比較費(fèi)時(shí)間,二來(lái)覺(jué)對(duì)封裝這種底層 http 調(diào)用來(lái)說(shuō),應(yīng)該有更好的選擇。不想自己再去造輪子。

          于是,我發(fā)現(xiàn)了一款優(yōu)秀的開(kāi)源 http 框架,能屏蔽不同細(xì)節(jié) http api 所帶來(lái)的所有差異。能通過(guò)簡(jiǎn)單的配置像調(diào)用 rpc 框架一樣的去完成極為復(fù)雜的 http 調(diào)用。
          Forest

          https://gitee.com/dt_flys/forest

          2. 上手

          Forest 支持了 Springboot 的自動(dòng)裝配,所以只需要引入一個(gè)依賴就行


          ??com.dtflys.forest
          ??spring-boot-starter-forest
          ??1.3.0

          定義自己的接口類

          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);??
          }

          在啟動(dòng)類里配置代理接口類的掃描包

          @SpringBootApplication
          @ForestScan(basePackages?=?"com.example.demo.forest")
          public?class?DemoApplication?{
          ????public?static?void?main(String[]?args)?{
          ????????SpringApplication.run(DemoApplication.class,?args);
          ????}
          }

          這時(shí)候,你就可以從spring容器中注入你的代理接口,像調(diào)用本地方法一樣去調(diào)用http的api了

          @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));
          }

          日志打印,F(xiàn)orest 打印了內(nèi)部所用的 http 框架,和實(shí)際請(qǐng)求 url 和返回。當(dāng)然日志可以通過(guò)配置去控制開(kāi)關(guān)。

          3. 特點(diǎn)

          我覺(jué)得對(duì)于尤其是做對(duì)接第三方 api 的開(kāi)發(fā)同學(xué)來(lái)說(shuō),這款開(kāi)源框架能幫你提高很多效率。

          搜索公縱號(hào):MarkerHub,關(guān)注回復(fù)[?vue?]獲取前后端入門教程

          Forest 底層封裝了 2 種不同的 http 框架:Apache httpClient 和 OKhttp。所以這個(gè)開(kāi)源框架并沒(méi)有對(duì)底層實(shí)現(xiàn)進(jìn)行重復(fù)造輪子,而是在易用性上面下足了功夫。

          我用 Forest 最終完成了和多個(gè)服務(wù)商 api 對(duì)接的項(xiàng)目,這些風(fēng)格迥異的 API,我僅用了 1 個(gè)小時(shí)時(shí)間就把他們轉(zhuǎn)化為了本地方法。然后項(xiàng)目順利上線。

          Forest 作為一款更加高層的 http 框架,其實(shí)你并不需要寫(xiě)很多代碼,大多數(shù)時(shí)候,你僅通過(guò)一些配置就能完成 http 的本地化調(diào)用。而這個(gè)框架所能覆蓋的面,卻非常之廣,滿足你絕大多數(shù)的 http 調(diào)用請(qǐng)求。

          Forest 有以下特點(diǎn):

          • 以 Httpclient 和 OkHttp 為后端框架

          • 通過(guò)調(diào)用本地方法的方式去發(fā)送 Http 請(qǐng)求, 實(shí)現(xiàn)了業(yè)務(wù)邏輯與 Http 協(xié)議之間的解耦

          • 相比 Feign 更輕量,不依賴 Spring Cloud 和任何注冊(cè)中心

          • 支持所有請(qǐng)求方法:GET, HEAD, OPTIONS, TRACE, POST, DELETE, PUT, PATCH

          • 支持靈活的模板表達(dá)式

          • 支持過(guò)濾器來(lái)過(guò)濾傳入的數(shù)據(jù)

          • 基于注解、配置化的方式定義 Http 請(qǐng)求

          • 支持 Spring 和 Springboot 集成

          • 實(shí)現(xiàn) JSON 和 XML 的序列化和反序列化

          • 支持 JSON 轉(zhuǎn)換框架: Fastjson,Jackson, Gson

          • 支持 JAXB 形式的 XML 轉(zhuǎn)換

          • 支持 SSL 的單向和雙向加密

          • 支持 http 連接池的設(shè)定

          • 可以通過(guò) OnSuccess 和 OnError 接口參數(shù)實(shí)現(xiàn)請(qǐng)求結(jié)果的回調(diào)

          • 配置簡(jiǎn)單,一般只需要 @Request 一個(gè)注解就能完成絕大多數(shù)請(qǐng)求的定義

          • 支持異步請(qǐng)求調(diào)用

          4. 兩個(gè)很棒的功能

          這里不對(duì)使用方式和配置方式一一描述,有興趣的可以去閱讀詳細(xì)文檔:

          https://dt_flys.gitee.io/forest 這里只想分析這個(gè)框架 2 個(gè)我認(rèn)為比較好的功能

          4.1 模板表達(dá)式和參數(shù)的映射綁定功能

          模板表達(dá)式在使用的時(shí)候特別方便,舉個(gè)栗子

          @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
          )
          ;

          上述是用序號(hào)下標(biāo)進(jìn)行取值,也可以通過(guò)名字進(jìn)行取值:

          @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
          )
          ;

          甚至于可以這樣簡(jiǎn)化寫(xiě):

          @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
          )
          ;

          以上三種寫(xiě)法是等價(jià)的

          當(dāng)然你也可以把參數(shù)綁定到 header 和 body 里去,你甚至于可以用一些表達(dá)式簡(jiǎn)單的把對(duì)象序列化成 json 或者 xml:

          @Request(
          ????url?=?"${base}/pay",
          ???contentType?=?"application/json",
          ????type?=?"post",
          ????dataType?=?"json",
          ????headers?=?{"Authorization:?${1}"},
          ????data?=?"${json($0)}"
          )

          public?PayResponse?pay(PayRequest?request,?String?auth);

          當(dāng)然數(shù)據(jù)綁定這塊詳情請(qǐng)參閱文檔

          4.2 對(duì) HTTPS 的支持

          以前用其他 http 框架處理 https 的時(shí)候,總覺(jué)得特別麻煩,尤其是雙向證書(shū)。每次碰到問(wèn)題也只能去 baidu。然后根據(jù)別人的經(jīng)驗(yàn)來(lái)修改自己的代碼。

          Forest 對(duì)于這方面也想的很周到,底層完美封裝了對(duì) https 單雙向證書(shū)的支持。也是只要通過(guò)簡(jiǎn)單的配置就能迅速完成。舉個(gè)雙向證書(shū)栗子:

          @Request(
          ????url?=?"${base}/pay",
          ???contentType?=?"application/json",
          ????type?=?"post",
          ????dataType?=?"json",
          ???keyStore?=?"pay-keystore",
          ???data?=?"${json($0)}"
          )

          public?PayResponse?pay(PayRequest?request);

          其中 pay-keystore 對(duì)應(yīng)著 application.yml 里的 ssl-key-stores

          forest:
          ??...
          ??ssl-key-stores:
          ????-?id:?pay-keystore
          ??????file:?test.keystore
          ??????keystore-pass:?123456
          ??????cert-pass:?123456
          ??????protocols:?SSLv3

          這樣設(shè)置,就 ok 了,剩下的,就是本地代碼形式的調(diào)用了。

          5. 最后

          Forest 有很多其他的功能設(shè)定,如果感興趣的同學(xué)還請(qǐng)仔細(xì)去閱讀文檔和示例。

          但是我想說(shuō)的是,相信看到這里,很多人一定會(huì)說(shuō),這不就是 Feign 嗎?

          我在開(kāi)發(fā) Spring Cloud 項(xiàng)目的時(shí)候,也用過(guò)一段時(shí)間 Feign,個(gè)人感覺(jué) Forest 的確在配置和用法上和 Feign 的設(shè)計(jì)很像,但 Feign 的角色更多是作為 Spring Cloud 生態(tài)里的一個(gè)成員。充當(dāng) RPC 通信的角色,其承擔(dān)的不僅是 http 通訊,還要對(duì)注冊(cè)中心下發(fā)的調(diào)用地址進(jìn)行負(fù)載均衡。

          而 Forest 這個(gè)開(kāi)源項(xiàng)目其定位則是一個(gè)高階的 http 工具,主打友好和易用性。從使用角度出發(fā),個(gè)人感覺(jué) Forest 配置性更加簡(jiǎn)單直接。提供的很多功能也能解決很多人的痛點(diǎn)。

          開(kāi)源精神難能可貴,好的開(kāi)源需要大家的添磚加瓦和支持。希望這篇文章能給大家在選擇 http 客戶端框架時(shí)帶來(lái)一個(gè)新的選擇:Forest


          之前博主分享了很多資源,有的已經(jīng)刪除了(你懂得),如果有的你當(dāng)時(shí)沒(méi)有領(lǐng)到還想領(lǐng)得就可以加我微信,我在發(fā)給你,你需要得資源也可以給我說(shuō),我盡力給你找~
          ????????????????????????回復(fù)"宿舍”獲取宿舍管理系統(tǒng)教程
          回復(fù)“權(quán)限”獲取spring security與spingmvc分布式權(quán)限管理系統(tǒng)



          好文!必須在看
          瀏覽 63
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  在线亚洲中文在线观看 | 日本最新三级 | 免费一级aa | 久久成人电影院 | 国产三级三级三级看三级囯产亚洲 |