5.6.2.2 Reach的RPC协议规范

Reach的RPC协议(后续,将使用“协议”或“它”指代)是一款基于JSON实例的RPC协议。

它将使用HTTPS协议进行传输 (如基于TLS的HTTP协议)。

请求中必须要包含 X-API-Key 头部,其值为服务器与RPC客户端之间共享的秘密信息。我们称其为API密钥。通常这个值来自环境变量REACH_RPC_KEY,是24个随机字节的Base64编码信息。

需要使用 POST 这一HTTP方法发送请求。

请求指定通过HTTP请求目标调用的RPC方法)。

HTTP请求体内必须要包含一个使用JSON编码的数组。请求应将 Content-Type 标头设置为 application/json; charset=utf-8来表明这一点。这个数组将会被解释为RPC方法)的参数。

响应体中需要包含一个使用JSON编码的值。响应应当设置Content-Type标头为:application/json; charset=utf-8。

响应会包含RPC句柄,其字符串内容指明了存储在服务端无法被序列化为JSON的中间数据资源。

RPC方法)既可以是同步值RPC方法)也可以是交互式RPC方法)。

同步值RPC方法消耗参数并产生一个唯一的结果,不需要与客户端进行进一步互动。该结果通过响应体发送。

例如,formatCurrency是一个同步值RPC方法)。形如formatCurrency("19283.1035819471", 4)的调用将会用如下HTTP会话进行表示,其中符号+对应的是HTTP请求数据,-则对应的是HTTP响应数据:

+ POST /stdlib/formatCurrency HTTP/1.1
+ X-API-Key: OpenSesame
+ Content-Type: application/json; charset=utf-8
+
+ [ “19283.1035819471”, 4 ]
- HTTP/1.1 200 OK
- Content-Type: application/json; charset=utf-8
-
- “19283.1035”

交互式RPC方法 使用参数,包括交互式RPC callback)的说明,并产生一个交互式RPC continuation) 。

交互式 RPC callback是一个JSON对象的键,其值会绑定为’true’,表示交互式RPC方法)的发起者在这个调用执行期间响应进一步的数据请求。

交互式 RPC continuation 是一个符合如下要求的JSON对象:

Kont 值产生时,交互式RPC方法)将会暂停直到/kont这一RPC方法)被执行,并获得RPC句柄)和交互式RPC回调)的返回值。/kont的RPC方法)结果是另一个交互式的RPC continuation)。

客户端可以在交互式RPC方法)暂停时执行任何RPC方法(tech._interactive._rpc._method)。

服务器可以多次重复使用同一个交互式RPC continuation)进行处理。

例如,可以参考一个后端)执行交互式RPC方法)过程。交互的例子可以用下面的HTTP会话表示,请求行用+表示,响应行用-表示。

+ POST /backend/Alice HTTP/1.1
+ X-API-Key: OpenSesame
+ Content-Type: application/json; charset=utf-8
+
+ [ “Contract-42”, { “price”: 10 }, { “showX”: true } ]
- HTTP/1.1 200 OK
- Content-Type: application/json; charset=utf-8
-
- { t: “Kont”, kid: “Kont-A”, m: “showX”, args: [ “19283.1035819471” ] }
+ POST /stdlib/formatCurrency HTTP/1.1
+ X-API-Key: OpenSesame
+ Content-Type: application/json; charset=utf-8
+
+ [ “19283.1035819471”, 4 ]
- HTTP/1.1 200 OK
- Content-Type: application/json; charset=utf-8
-
- “19283.1035”
+ POST /kont HTTP/1.1
+ X-API-Key: OpenSesame
+ Content-Type: application/json; charset=utf-8
+
+ [ “Kont-A”, null ]
- HTTP/1.1 200 OK
- Content-Type: application/json; charset=utf-8
-
- { t: “Done”, ans: null }