jsonrpc.js -- 原生js實現 JSON-RPC 協議


很早以前就涉及到多端遠程調用 api的設計,那時候自己設計了個消息傳遞回調過程。最近了解了JSON-RPC協議,更正規,就可以自己實現下。邏輯也不復雜,沒有限制底層消息傳遞的方式,可以應用到更多的場景。在實現中,沒有區分服務器端和客戶端的概念,獲得不同的消息體,進行不同的處理,更方便的進行雙向通信。

github地址: https://github.com/legu2009/jsonrpc

博客園地址:http://www.cnblogs.com/legu/p/8119678.html

jsonrpc

    JSON-RPC 是一個無狀態的輕量的遠程調用協議. http://www.jsonrpc.org/specification.

    jsonrpc.js 實現了 JSON-RPC 協議,沒有實現消息傳遞的過程。實際使用的時候需要自己根據消息傳遞的方式擴展,也是該js應用的場景更廣泛,不局限於底層消息傳遞方式。

環境

    jsonrpc.js 只要是能夠運行js的環境都可以。

不支持批量消息

    處理批量消息的情況,有些是同步的,有些是異步的可能需要等待很長的時間,如果等所有批量的消息都有返回結構了,才發送結果消息,感覺存在的浪費

API

JsonRpc Function
返回一個 jsonRpc 實例,實例之間共用自增長 id
 
   success Function
      fail Function
}
作為服務端,JsonRpc上的靜態屬性,只在作為服務器端函數運行的時候,指向了當前消息回調的方法,如果是異步處理,請一開始緩存running對象保證函數正確

jsonRpc.addCommand(name,func,opt) Function

作為服務端,注冊可以被遠程端調用的方法

Arguments

  • name(String): 方法的名字
  • func(Function): 對應的方法
  • opt(Object):
    {
          sync: false,//默認情況,函數返回不是Promise且為undefind時不調用回調
          always: false,//默認情況,函數回調一次就不在調用回調,設置true可以一直回調,但是需要使用JsonRpc.running緩存回調方法,進行調用
    }

jsonRpc.removeCommand(name) Function

作為服務端,移除遠程端調用的方法

Arguments

jsonRpc.exec([extend],name,[params],[func]) Function

作為客戶端,發起遠程調用,調用遠端name的方法,參數為params(JSON-RPC,協議,支持Arrary和Object),獲得返回的運行結果的時候,運行對應的func方法

Arguments

  • extend:
    {
       always: true,//函數回調不會清除引用,用於響應多server消息響應
       ...otherProps: //Object.assign 擴展obj
    }
  • name(String): 遠端方法的名字
  • params(Arrary or Object): 運行遠端方法時候的參數(形式同JSON-RPC協議 的 params)
  • func(Function(reresult messages)): 返回的運行結果的時候,運行對應的方法,沒有該參數,為通知方式發送消息

jsonRpc._send Function

需要擴展,實現底層消息傳遞

Arguments

  • obj(Object): 需要發送到遠端的消息對象
  • mess(Object): mess是undefined時,本地可以理解為客戶端,運行了jsonRpc.exec方法; mess存在的時候,本地可以理解為服務端,運行了對應的方法,mess為請求的數據

jsonRpc._onMessage Function

當有消息接收的時候主動調用,通過jsonRpc處理邏輯

jsonRpc.onCall(mess) Function

作為服務端,注冊的方法執行前調用,返回false不執行方法

jsonRpc.onResult(mess) Function

作為客戶端,接收到返回消息,執行回調之前,返回false不執行回調

EXAMPLE

    沒有實際項目應用,只是覺得需要支持

test.html

    基本消息傳遞的例子

sync.html

    同步函數情況下,對返回值undefind的特殊處理

send.html

    通過_call,從消息體本身的設計,限制哪個服務端執行邏輯

result.html

    通過_guid,從消息體本身的設計,限制客戶端對回調消息的執行,提高消息驗證

always1.html

    作為服務器端,回調消息 分多次返回客戶端執行回調方法

always2.html

    作為客戶端,對一次發送多個服務器端消息,所有響應都執行回調方法,默認回調只執行第一次


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM