NBS节点Api接口的访问方式

Graphene API 通讯方式

NBS系统共支持两种 API 调用方式:

  • WebSocket Calls – 长连接调用
  • Remote Procedure Calls – HTTP 方式调用

官方 GitHub 仓库提供的 GUI 钱包客户端 newbitshares-ui 就是使用 WebSocket 方式通讯的,此钱包客户端是使用 React 开发的前端工程,然后使用 Electron 工具打包成了各平台可用的桌面客户端,这样做的优势在于,技术栈全部使用前端技术,可以做功能的一次性开发,然后使用相关的打包工具,进行跨平台的客户端打包,能够同时进行 Web 端和 桌面客户端 的开发。

关于 NBS官方的 GitHub 账号开源的几个项目,作一下简要的介绍,其中,newbitshares-ui 项目依赖 bitsharesjs , 而 bitsharesjs 又依赖 bitsharesjs-ws 项目,它们之间的职责关系如下:

  • newbitshares-ui 完整的钱包客户端项目,使用 React + Electron 技术栈,同时支持 Web 和 桌面客户端的打包。
  • bitsharesjs API业务工具,基层依赖 bitsharesjs-ws 项目进行API通讯,其模块内部封装并完成了大部分的业务API。
  • bitsharesjs-ws 针对 Graphene 系统定制的 WebSocket 接口访问通信工具,封装并定制了系统特有的API访问流程。

WebSocket 调用 API 数据结构

{

 “id”       : 1,            // 调用标识

 “method”   : “call”,

 “params”   :               // 格式必须严格按照如下顺序传递

    [        

        0,                  //  API类型标识符

        “get_accounts”,     //  接口名称

        [[“1.2.0”]]         //  接口参数列表

    ]

}

id 字段的作用是专门针对 WebSocket 方式的 API 定制的,我们知道 WebSocket 是长连接协议,像 Socket 编程一样,可以发送二进制和文本类型的数据。但是发送数据和返回数据之间是无序的,你可能发送的顺序是 A-api、B-api ,然而服务器端响应给你的顺序却可能是 B-result、A-result。

所以 API 在设计的时候特限定了一个 id 字段,当你发起 API 调用的时候指定一个唯一 id ,那么在响应结果里面,会把这个 id 再返回给你,你就可以根据这个 id 来区别响应结果应该怎么处理。

另外需要注意的就是 params 字段,此字段是一个数组类型,第一个元素代表 API 标识符,第二个元素代表要调用的 API 名称,第三个元素同样是一个数组类型,其数组中的每一个元素都将作为 API 的一个参数传递,并且应该注意参数的顺序与格式。

API 调用流程

NBS系统的完整客户端节点提供了一系列可以通过 WebSocket 方式访问的API,API调用流程,应该首先有一个初始化的调用过程:

1.首先应该登录到完整节点 :

{“id”:0, “method”:”call”, “params”:[1, “login”, [“”,””]]}

2.然后获取指定类型的API标识 :

// 你可以动态的修改 “database” 属性,来获取不同的 API 类型请求标识。

{“id”:0, “method”:”call”, “params”:[1, “database”, []]}

// 此次请求调用返回结果里面的 “result” 值,就是 “database” 类型 API 的标识符。

{“id”:2, “result”:2}

3.你可以多次的进行第二步操作,拿到不同类型的 API 标识符,最后只需要之前介绍过的 API 数据结构指定好 idparams 参数格式,即可调用所有公开的 API 接口。

API 返回结果数据格式

调用成功 JSON 格式 :

{

  “id”      : 1,    //  调用 API 时传递的调用标识。

  “result”  : …data…

}

调用失败 JSON 格式 :

{

  “id”    : 0,    // 调用 API 时传递的调用标识。

  “data”  : {

    “code”  : 1,

    “error” : {

      “code”    : error-code,

      “name”    : ” .. name of exception ..”

      “message” : ” .. message of exception ..”,

      “stack”   : [ .. stack trace .. ],

    },

  },

}

API 是否调用成功,可以简单的通过判断结果是否包含 resutl 字段来区分,假如包含 result 字段就可以认为调用成功,不同 API 有不同的 result 结构,届时根据 API 文档,分别进行解析处理即可。

运行时witness_node,最初有两个 API 可用:

  • API 0 提供对数据库的只读访问
  • API 1 用于登录并访问其他受限的 API。

这是一个使用来自 npm 的 wscat 包用于 websockets 的示例:

$ npm install -g wscat

$ wscat -c ws://127.0.0.1:8090

请求 {“id”:1, “method”:”call”, “params”:[0,”get_accounts”,[[“1.2.0”]]]}

返回 {“id”:1,”result”:[…data…]}

对于不需要登录或其他会话状态的 API,我们可以使用 HTTP 客户端(例如 curl)来执行相同的操作:

$ curl –data ‘{“jsonrpc”: “2.0”, “method”: “call”, “params”: [0, “get_accounts”, [[“1.2.0”]]], “id”: 1}’ http://127.0.0.1:8090/rpc

返回 {“id”:1,”result”:[…data…]}

API 0 可使用常规 JSON-RPC 访问:

$ curl –data ‘{“jsonrpc”: “2.0”, “method”: “get_accounts”, “params”: [[“1.2.0”]], “id”: 1}’ http://127.0.0.1:8090/rpc

由于受限 API 需要登录,因此只能通过 websocket RPC 访问它们。但是,要监控入金,我们只需要 API 0。