博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jsonrpc.js -- 原生js实现 JSON-RPC 协议
阅读量:5269 次
发布时间:2019-06-14

本文共 2003 字,大约阅读时间需要 6 分钟。

很早以前就涉及到多端远程调用 api的设计,那时候自己设计了个消息传递回调过程。最近了解了JSON-RPC协议,更正规,就可以自己实现下。逻辑也不复杂,没有限制底层消息传递的方式,可以应用到更多的场景。在实现中,没有区分服务器端和客户端的概念,获得不同的消息体,进行不同的处理,更方便的进行双向通信。

github地址:

博客园地址:

jsonrpc

    JSON-RPC 是一个无状态的轻量的远程调用协议. .

    jsonrpc.js 实现了 JSON-RPC 协议,没有实现消息传递的过程。实际使用的时候需要自己根据消息传递的方式扩展,也是该js应用的场景更广泛,不局限于底层消息传递方式。

环境

    jsonrpc.js 只要是能够运行js的环境都可以。

不支持批量消息

    处理批量消息的情况,有些是同步的,有些是异步的可能需要等待很长的时间,如果等所有批量的消息都有返回结构了,才发送结果消息,感觉存在的浪费

API

JsonRpc Function
返回一个 jsonRpc 实例,实例之间共用自增长 id
 
JsonRpc.running = {
   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

  • name(String): 方法的名字

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

    作为客户端,对一次发送多个服务器端消息,所有响应都执行回调方法,默认回调只执行第一次

转载于:https://www.cnblogs.com/legu/p/8119678.html

你可能感兴趣的文章
Linux编程简介——gcc
查看>>
2019年春季学期第四周作业
查看>>
MVC4.0 利用IActionFilter实现简单的后台操作日志功能
查看>>
rotate the clock
查看>>
bugku 变量
查看>>
Python 环境傻瓜式搭建 :Anaconda概述
查看>>
数据库01 /Mysql初识以及基本命令操作
查看>>
数据库02 /MySQL基础数据类型以及多表之间建立联系
查看>>
Python并发编程04/多线程
查看>>
CF461B Appleman and Tree
查看>>
CF219D Choosing Capital for Treeland
查看>>
杂七杂八的小笔记本
查看>>
51Nod1353 树
查看>>
CF1215E Marbles
查看>>
BZOJ2339 HNOI2011卡农(动态规划+组合数学)
查看>>
octave基本操作
查看>>
axure学习点
查看>>
WPF文本框只允许输入数字[转]
查看>>
dom4j 通用解析器,解析成List<Map<String,Object>>
查看>>
第一个项目--用bootstrap实现美工设计的首页
查看>>