API的實(shí)現(xiàn)方法是什么

這篇文章主要介紹“API的實(shí)現(xiàn)方法是什么”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“API的實(shí)現(xiàn)方法是什么”文章能幫助大家解決問題。

創(chuàng)新互聯(lián)長期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為科爾沁右翼中企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì),科爾沁右翼中網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

1 對(duì)外接口的設(shè)計(jì)準(zhǔn)則

SDK對(duì)外提供接口設(shè)計(jì)的基本原則是易用,易懂,易擴(kuò)展,易監(jiān)控。展開來可歸納為以下幾個(gè)特性:

  1. API按照業(yè)務(wù)功能分類,但所有業(yè)務(wù)具有統(tǒng)一的調(diào)用風(fēng)格。

  2. API不包含方法實(shí)現(xiàn),接口的實(shí)現(xiàn)對(duì)調(diào)用者隱藏。

  3. API調(diào)用可跟蹤。

在功能形式上,SDK需要提供以下類型的API:

  1. 功能接口:主動(dòng)調(diào)用使用其提供的功能

    1. 同步接口:在調(diào)用線程完成函數(shù)調(diào)用,并立即返回結(jié)果。

    2. 普通異步接口:在后臺(tái)線程完成函數(shù)調(diào)用,可以添加回調(diào)函數(shù)。

    3. 可中斷異步接口:在后臺(tái)線程完成函數(shù)調(diào)用,可以添加回調(diào)函數(shù),可以中斷調(diào)用。

  2. 回調(diào)接口:監(jiān)聽數(shù)據(jù)和狀態(tài)改變。

2 業(yè)務(wù)的分類

SDK包含多種業(yè)務(wù),一部分是基礎(chǔ)業(yè)務(wù),另一部分是可選業(yè)務(wù)。比如用戶認(rèn)證服務(wù)、群服務(wù)等是基礎(chǔ)業(yè)務(wù);超大群服務(wù)、第三方推送服務(wù)等是可選業(yè)務(wù)。另外,不同的業(yè)務(wù)之間難免有相似的功能,如群服務(wù)和超大群服務(wù)中,都有添加群成員,拉取群消息等功能。因此,需要將不同的業(yè)務(wù)進(jìn)行隔離,一方面方便業(yè)務(wù)功能的擴(kuò)展與調(diào)整,另一方面方便函數(shù)的命名與用戶的理解。

同一個(gè)業(yè)務(wù)下有多個(gè)API,按照調(diào)用的主動(dòng)性,分為回調(diào)接口和功能接口,分別放在與業(yè)務(wù)一一對(duì)應(yīng)的接口類Observer和Service中。例如:用戶認(rèn)證服務(wù)下的所有回調(diào)接口和功能接口都位于AuthServiceObserver和AuthService中。其中由用戶主動(dòng)調(diào)用來實(shí)現(xiàn)功能的功能接口在AuthService中,如登錄、登出等;而用于注冊(cè)回調(diào)的回調(diào)接口都在AuthServiceObserver中,如監(jiān)聽在線狀態(tài)、監(jiān)聽數(shù)據(jù)同步等。

每個(gè)Service中的功能接口根據(jù)執(zhí)行的性質(zhì)又分為三種,同步接口、普通異步接口和可中斷異步接口。其中同步接口在調(diào)用線程立即執(zhí)行;異步接口在后臺(tái)線程執(zhí)行,在調(diào)用線程返回可設(shè)置回調(diào)的InvocationFuture類型,最終結(jié)果在主線程回調(diào);可中斷異步接口和普通異步接口相似,但是返回的是繼承自InvocationFuture的AbortableFuture類型,支持中斷操作,用戶可以通過主動(dòng)調(diào)用來中斷功能接口的執(zhí)行。接口調(diào)用的線程切換流程如圖2.1所示,業(yè)務(wù)功能和接口的分類如圖2.2所示。

API的實(shí)現(xiàn)方法是什么

圖 2.1 接口調(diào)用的線程切換流程

API的實(shí)現(xiàn)方法是什么

圖 2.2 業(yè)務(wù)功能和接口的分類

3 API的實(shí)現(xiàn)

3.1 API的實(shí)現(xiàn)方式

為了實(shí)現(xiàn)這些目標(biāo),并考慮到實(shí)現(xiàn)簡單,我們選用Java的動(dòng)態(tài)代理類模型。外部調(diào)用者調(diào)用API時(shí),得到一個(gè)動(dòng)態(tài)代理(Proxy)對(duì)象,通過Proxy對(duì)象,將功能接口的調(diào)用全部轉(zhuǎn)接到一個(gè)實(shí)現(xiàn)了InvocationHandler 接口的類ProxyHandler上。再根據(jù)調(diào)用方法,執(zhí)行注冊(cè)/注銷回調(diào)或者將調(diào)用請(qǐng)求分派到真正的實(shí)現(xiàn)類上,最后根據(jù)接口的返回類型進(jìn)行返回或回調(diào),如圖3.1所示。

API的實(shí)現(xiàn)方法是什么

圖 3.1 功能調(diào)用流程

和用戶服務(wù)的接口類AuthService和AuthServiceObserver一樣,SDK也為其他的所有業(yè)務(wù)定義了接口類。所有接口類和實(shí)現(xiàn)類呈一一對(duì)應(yīng)關(guān)系,可以方便地找到API對(duì)應(yīng)的實(shí)現(xiàn)。

3.2 獲取Proxy對(duì)象的方法

SDK對(duì)外提供了靜態(tài)方法NimClient.getService(Class<T> clazz)來獲取業(yè)務(wù)接口類對(duì)應(yīng)的動(dòng)態(tài)代理類。參數(shù)填入對(duì)應(yīng)的接口類即可。例如:獲取用戶認(rèn)證服務(wù)的接口類的方式為NimClient.getService(AuthService.class),獲取用戶認(rèn)證服務(wù)觀察者的接口類的方式為NimClient.getService(AuthServiceObserver.class)。

    NimClient.getService方法同步返回一個(gè)Proxy對(duì)象。該對(duì)象的構(gòu)造方式為懶加載,業(yè)務(wù)被調(diào)用的時(shí)候才構(gòu)造對(duì)應(yīng)實(shí)例。如圖3.2所示。

API的實(shí)現(xiàn)方法是什么

圖 3.2 獲取業(yè)務(wù)Proxy對(duì)象流程

    生成Proxy對(duì)象基于Proxy.newProxyInstance方法,所有生成的Proxy對(duì)象都由專門的容器類來管理。以用戶認(rèn)證服務(wù)為例,第一次調(diào)用NimClient.getService(AuthService.class)獲取用戶認(rèn)證服務(wù)的Proxy對(duì)象時(shí),容器理類創(chuàng)建一個(gè)對(duì)應(yīng)的Proxy對(duì)象并緩存。之后再次獲取用戶認(rèn)證服務(wù)Proxy對(duì)象時(shí),容器類將緩存直接返回。

3.3 事務(wù)跟蹤類

    invoke函數(shù)中有一個(gè)重要的事務(wù)跟蹤類(Transaction),它記錄了方法的同步異步屬性、方法體和返回值要求等。Transaction對(duì)象和他的實(shí)現(xiàn)方法是一一對(duì)應(yīng)的。每次執(zhí)行invoke方法,都會(huì)創(chuàng)建一個(gè)Transaction實(shí)例,并傳輸?shù)秸嬲膱?zhí)行點(diǎn)去執(zhí)行

       執(zhí)行完畢后,invoke方法根據(jù)同步異步特性以及返回值,來確定功能函數(shù)的返回結(jié)果。如果是同步函數(shù),則直接返回結(jié)果;如果是異步函數(shù),則根據(jù)業(yè)務(wù)需求返回InvocationFuture或者AbortableFuture。

3.4 API的執(zhí)行方式

NimClient.getService返回的是動(dòng)態(tài)代理類ProxyHandler ,它實(shí)現(xiàn)了InvocationHandler接口的 Object invoke(Object who, Method method, Object[] args)方法,用于代理所有功能接口。

API執(zhí)行方式,即ProxyHandler對(duì)invoke方法的實(shí)現(xiàn)方式,其大體步驟是加載事務(wù)、初始化判斷、執(zhí)行事務(wù)和返回,如圖3.3所示。

API的實(shí)現(xiàn)方法是什么

圖 3.3 代理執(zhí)行的簡要流程

執(zhí)行事務(wù)這一環(huán)節(jié)還可以細(xì)分為回調(diào)接口的執(zhí)行和功能接口的執(zhí)行,如果是執(zhí)行回調(diào)接口,則判斷是否需要回調(diào)當(dāng)前狀態(tài),如果是,則立即回調(diào)。

Transaction的執(zhí)行函數(shù)是TransactionExecutor. execute方法,送出Transaction后,invoke方法會(huì)根據(jù)同步異步屬性,決定是在當(dāng)前線程執(zhí)行,還是在后臺(tái)線程執(zhí)行。用于異步執(zhí)行Transaction的后臺(tái)線程是唯一的,如果有多個(gè)Transaction需要被異步執(zhí)行,則會(huì)阻塞。

    接口類的每個(gè)方法都被存進(jìn)一個(gè)Map中,SDK以方法簽名實(shí)現(xiàn)了同名函數(shù)重載。執(zhí)行Transaction時(shí),通過方法所在的接口類找到對(duì)應(yīng)的實(shí)現(xiàn)類,再調(diào)用對(duì)應(yīng)的invoke方法即可。對(duì)于異步方法,invoke方法的返回值不會(huì)被返回到上層,因此異步API函數(shù)的實(shí)現(xiàn)不用關(guān)心返回值。代理的詳細(xì)執(zhí)行流程如圖3.4所示

API的實(shí)現(xiàn)方法是什么

圖 3.4 代理的詳細(xì)流程

3.5 異步方法的回調(diào)

    對(duì)于異步方法,在TransactionExecutor. execute執(zhí)行前,先基于Transaction生成對(duì)應(yīng)的AbortableFuture的實(shí)現(xiàn)類TransactionFuture,然后將其緩存,用于稍后的回調(diào)。異步方法執(zhí)行完畢后,將子類返回到調(diào)用層。

    在調(diào)用可中斷異步接口后,同步返回的是AbortableFuture實(shí)例。調(diào)用方可以直接調(diào)用abort方法中止執(zhí)行。例如:調(diào)用了用于下載消息附件的downloadAttachment函數(shù)后,由于文件太大,網(wǎng)絡(luò)狀況不好等情況需要取消下載時(shí),可以主動(dòng)調(diào)用abort方法來終止。調(diào)用方式如圖3.5所示??芍袛喈惒浇涌趯?duì)應(yīng)的abort方法由SDK內(nèi)部實(shí)現(xiàn),調(diào)用者不需要關(guān)心其實(shí)現(xiàn)方式。

API的實(shí)現(xiàn)方法是什么

圖 3.5 abort函數(shù)調(diào)用示例

    TransactionFuture回調(diào)的基本類型為RequestCallback,SDK在此基本類型中定義了onSuccess、onFailed和onException函數(shù),分別用于在成功、失敗和異常情況下根據(jù)執(zhí)行結(jié)果的不同,回調(diào)到不同的函數(shù)。到此整個(gè)流程結(jié)束。

關(guān)于“API的實(shí)現(xiàn)方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

名稱欄目:API的實(shí)現(xiàn)方法是什么
網(wǎng)站鏈接:http://www.muchs.cn/article38/pdhjpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、全網(wǎng)營銷推廣、網(wǎng)站收錄、品牌網(wǎng)站制作、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司