# process.rpc.jsonClient 库模块帮助文档

## process.rpc 成员列表 <a id="process.rpc" href="#process.rpc">&#x23;</a>

### process.rpc.jsonClient <a id="process.rpc.jsonClient" href="#process.rpc.jsonClient">&#x23;</a>
基于进程管道通过读写进程标准输入输出实现的 JSON-RPC 客户端。  
用法参考『 范例 » 调用其他语言 » Go » RPC 』，或 process.r 扩展库范例。  

规则说明：  
1、 所有 JSON-RPC 消息必须置于 { } 或 [ ] 内，aardio 输出 JSON 时以换行符结束。  
2、  
aardio 读取进程输出时获取第一个能成功解析为响应对象的 JSON，  
└── 单次调用的响应对象应当是 { } 包含的对象且包含 id 字段。  
└── 批量调用的响应对象应当是 [ ] 包含的非空数组且数组元素存在 id 字段。  
响应对象 JSON 不要求以换行符结束，忽略进程的其他输出。  
客户端总是在发送请求后再读取回复（应答对象的 id 字段必须与请求对象的 id 字段相同）。  

关于 [ JSON-RPC 2.0](http://www.jsonrpc.org/specification)

创建 JSON-RPC 2.0 客户端，兼容 JSON-RPC 1.0 。  
用法请参考『 范例 » 调用其他语言 » Go » RPC 』，  
或 process.r 扩展库范例  

启动失败返回 null,错误信息。  
成功返回 RPC 调用对象

### process.rpc.jsonClient() <a id="process.rpc.jsonClient" href="#process.rpc.jsonClient">&#x23;</a>
[返回对象:processRpcJsonClientObject](#processRpcJsonClientObject)

### process.rpc.jsonClient(执行文件,命令行参数,STARTUPINFO) <a id="process.rpc.jsonClient" href="#process.rpc.jsonClient">&#x23;</a>
启动目标进程，并返回 JSON-RPC 客户端。  
目标进程自动绑定作业对象 process.job.limitKill 。  
进程管道默认编码设为 UTF-8。  

命令行参数可以是一个数组、一个或多个字符串参数,  

数组或多个命令行参数调用 process.joinArguments 合并,  
不在双引号内、且包含空白或需要转义的参数转义处理后首尾添加双引号  

注意：如果参数 @1 为字符串，  
每次 RPC 调用时就会自动检测并重启意外退出的 RPC 服务进程。  
但每次调用只会尝试重启一次，不会连续重启

### process.rpc.jsonClient(进程管道) <a id="process.rpc.jsonClient" href="#process.rpc.jsonClient">&#x23;</a>
创建 JSON-RPC 客户端。  
参数 @1 必须指定 process.popen 对象  

启动失败返回 null,错误信息。  
成功返回 RPC 调用对象

## processRpcJsonClientObject 成员列表 <a id="processRpcJsonClientObject" href="#processRpcJsonClientObject">&#x23;</a>

### processRpcJsonClientObject.* <a id="processRpcJsonClientObject.any" href="#processRpcJsonClientObject.any">&#x23;</a>
远程对象名或远程方法名字。  
远程函数调用成功则第一个返回值为表对象，  
└── 该对象的 result 字段为返回值，error 为错误对象，两个字段不会同时存在。  
└── error 对象的 message 为错误信息，code 为错误代码，data 为错误附加数据。  
└── 如果存在 error 对象，则第 2 个返回值为 error 对象的 JSON 文本格式。  
调用失败第一个返回值为 null ，第二个返回值为错误信息  

如果调用 rpc.beginTrans 函数开始一个批量调用，  
则返回一个可以指定 end 成员函数的对象，服务器应答时自动回调此 end 函数  

[返回对象:processRpcJsonClientObject](#processRpcJsonClientObject)

## processRpcJsonClientObject.rpc 成员列表 <a id="processRpcJsonClientObject.rpc" href="#processRpcJsonClientObject.rpc">&#x23;</a>

RPC 本地客户端对象  
所以本地函数放在这个对象里面  
用户不得添加、删除、修改此对象的任何成员

### processRpcJsonClientObject.rpc.afterJsonStringify <a id="processRpcJsonClientObject.rpc.afterJsonStringify" href="#processRpcJsonClientObject.rpc.afterJsonStringify">&#x23;</a>

```aardio
processRpcJsonClientObject.rpc.afterJsonStringify = function(jsonData){
    /*可以在这里加密客户端JSON，返回 null 中止本次调用。*/
	return jsonData;
}
```

### processRpcJsonClientObject.rpc.beforeJsonParse <a id="processRpcJsonClientObject.rpc.beforeJsonParse" href="#processRpcJsonClientObject.rpc.beforeJsonParse">&#x23;</a>

```aardio
processRpcJsonClientObject.rpc.beforeJsonParse = function(jsonData){
    /*可以在这里解密服务端数据，返回 null 中止本次调用。  
定义此函数以后，服务端每次输出的 JSON 必须以换行符结束*/
	return jsonData;
}
```

### processRpcJsonClientObject.rpc.beforeRequest(请求数据) <a id="processRpcJsonClientObject.rpc.beforeRequest" href="#processRpcJsonClientObject.rpc.beforeRequest">&#x23;</a>

```aardio
processRpcJsonClientObject.rpc.beforeRequest = function(reqData){
	/*此回调事件在发送请求前触发。  
reqData.params 是即将发送的参数。*/
	return reqData;
}
```

### processRpcJsonClientObject.rpc.beginTrans() <a id="processRpcJsonClientObject.rpc.beginTrans" href="#processRpcJsonClientObject.rpc.beginTrans">&#x23;</a>
开始批量调用，注意多数服务器并不支持批量调用。  
aardio 实现的 process.rpc.jsonServer 可支持批量调用。  
批量调用时单次调用的返回值是一个表  
可对返回值指定 end 成员函数，  
end 函数会在 commitTrans 提交批量调用成功后被触发

### processRpcJsonClientObject.rpc.charset <a id="processRpcJsonClientObject.rpc.charset" href="#processRpcJsonClientObject.rpc.charset">&#x23;</a>
获取或修改编码,此值必须为大写，默认为"UTF-8",  
因为 JSON 规定了 Unicode 编码方案,所以不建议也不应该修改这个值

### processRpcJsonClientObject.rpc.close() <a id="processRpcJsonClientObject.rpc.close" href="#processRpcJsonClientObject.rpc.close">&#x23;</a>
关闭客户端

### processRpcJsonClientObject.rpc.commitTrans() <a id="processRpcJsonClientObject.rpc.commitTrans" href="#processRpcJsonClientObject.rpc.commitTrans">&#x23;</a>
完成批量调用，注意多数服务器并不支持批量调用。  
aardio 实现的 process.rpc.jsonServer 可支持批量调用。

### processRpcJsonClientObject.rpc.ctrlEvent(0) <a id="processRpcJsonClientObject.rpc.ctrlEvent" href="#processRpcJsonClientObject.rpc.ctrlEvent">&#x23;</a>
发送 Ctrl+C（SIGINT信号）  
信号将传递到与目标进程控制台连接的所有非分离控制台进程  
64位目标进程会导致当前控制台暂时关闭

### processRpcJsonClientObject.rpc.ctrlEvent(1) <a id="processRpcJsonClientObject.rpc.ctrlEvent" href="#processRpcJsonClientObject.rpc.ctrlEvent">&#x23;</a>
发送 Ctrl+Break（SIGINT信号）  
信号将传递到与目标进程控制台连接的所有非分离控制台进程  
64位目标进程会导致当前控制台暂时关闭

### processRpcJsonClientObject.rpc.getExitCode() <a id="processRpcJsonClientObject.rpc.getExitCode" href="#processRpcJsonClientObject.rpc.getExitCode">&#x23;</a>
该函数调用成功有两个返回值:目标进程退出代码,目标进程是否已退出

### processRpcJsonClientObject.rpc.kwargs <a id="processRpcJsonClientObject.rpc.kwargs" href="#processRpcJsonClientObject.rpc.kwargs">&#x23;</a>
是否支持 Python 命名参数（kwargs ）。  
仅适用于 process.python.jsonRpc，仅 varargs 属性为 true 时有效。  

调用时命名参数必须写在参数列表最前面，  
其后第一个出现的位置参数对应服务端的第一个位置参数

### processRpcJsonClientObject.rpc.lastResponse() <a id="processRpcJsonClientObject.rpc.lastResponse" href="#processRpcJsonClientObject.rpc.lastResponse">&#x23;</a>
获取最后一次服务器返回的原始数据,  
如果控制台已打开或在开发环境中导入 console 库则在控制台输出数据  
下载文件时该值为空

### processRpcJsonClientObject.rpc.notify("函数名",参数) <a id="processRpcJsonClientObject.rpc.notify" href="#processRpcJsonClientObject.rpc.notify">&#x23;</a>
发送通知,服务器不返回值,  
如果 varargs 属性指定为 true 时将不定个数参数合为数组，  
varargs为 false 时直接发送参数  

成功返回 true，失败返回 null,错误信息

### processRpcJsonClientObject.rpc.process <a id="processRpcJsonClientObject.rpc.process" href="#processRpcJsonClientObject.rpc.process">&#x23;</a>
进程管道对象  

[返回对象:processPopenObject](https://www.aardio.com/zh-cn/docs/library-reference/process/popen.html#processPopenObject)

### processRpcJsonClientObject.rpc.resume() <a id="processRpcJsonClientObject.rpc.resume" href="#processRpcJsonClientObject.rpc.resume">&#x23;</a>
目标进程恢复运行

### processRpcJsonClientObject.rpc.rollbackTrans() <a id="processRpcJsonClientObject.rpc.rollbackTrans" href="#processRpcJsonClientObject.rpc.rollbackTrans">&#x23;</a>
撤消尚未提交的批量调用

### processRpcJsonClientObject.rpc.stillActive() <a id="processRpcJsonClientObject.rpc.stillActive" href="#processRpcJsonClientObject.rpc.stillActive">&#x23;</a>
目标进程是否仍然运行

### processRpcJsonClientObject.rpc.suspend() <a id="processRpcJsonClientObject.rpc.suspend" href="#processRpcJsonClientObject.rpc.suspend">&#x23;</a>
目标进程暂停运行

### processRpcJsonClientObject.rpc.terminate() <a id="processRpcJsonClientObject.rpc.terminate" href="#processRpcJsonClientObject.rpc.terminate">&#x23;</a>
强制关闭进程并释放目标进程对象。  
注意如果在构造函数中指定了执行文件路径。  
且在目标进程退出后继续调用 RPC 函数。  
则会自动重启 RPC 服务进程。

### processRpcJsonClientObject.rpc.varargs <a id="processRpcJsonClientObject.rpc.varargs" href="#processRpcJsonClientObject.rpc.varargs">&#x23;</a>
默认值为 true,  
值为 true 时将不定个数的参数放入数组发送给服务端  
值为 false 时直接将单个参数发送给服务端  

JSON-RPC 2.0 一个会制造混乱的地方：  
如果params是一个数组，并没有规定是展开为一个参数，还是作为一个数组参数。  

目前 aardio 的 RPC 服务端会负责展开数组作为多个参数，  
但客户端需要在这里手动设置

### processRpcJsonClientObject.rpc.version <a id="processRpcJsonClientObject.rpc.version" href="#processRpcJsonClientObject.rpc.version">&#x23;</a>
值为 JSON-RPC 协议版本："2.0"  
不应该修改这个值

### processRpcJsonClientObject.rpc.wait() <a id="processRpcJsonClientObject.rpc.wait" href="#processRpcJsonClientObject.rpc.wait">&#x23;</a>
等待目标进程关闭,可选使用一个毫秒值参数设定超时。  
超时或失败返回 null，进程退出则返回值1为true，  
返回值2为标准输出，返回值3为错误输出，返回值4为退出代码  

如被调用进程写满输出缓冲区，而调用进程没有读取，  
则被调用进程会一直等待，此函数将无法返回。  
改用 readAll 函数读取输入可避免该问题。

### processRpcJsonClientObject.rpc.waitOne() <a id="processRpcJsonClientObject.rpc.waitOne" href="#processRpcJsonClientObject.rpc.waitOne">&#x23;</a>
等待目标进程关闭，不会阻塞当前线程窗口消息。  
可用一个毫秒值参数设定超时。  

超时或失败返回 null，进程已退出则返回值1为true，  
返回值2为标准输出,返回值3为错误输出,返回值4为退出代码  

如果被调用进程写满输出缓冲区，而调用进程没有读取，  
则被调用进程会一直等待，此函数将无法返回。  
改用 readAll 函数读取输入可避免该问题。  

注意如果正在调用异步 logResponse 回显到窗口对象。  
则 waitOne 函数仅返回单个值，不读取任何输出

### processRpcJsonClientObject.rpc.xcall("函数名",参数) <a id="processRpcJsonClientObject.rpc.xcall" href="#processRpcJsonClientObject.rpc.xcall">&#x23;</a>
调用远程函数。  
如果 varargs 属性指定为 true 时将不定个数参数合为数组，  
varargs 为 false 时直接发送参数  

远程函数调用成功则第一个返回值为表对象，  
└── 该对象的 result 字段为返回值，error 为错误对象，两个字段不会同时存在。  
└── error 对象的 message 为错误信息，code 为错误代码，data 为错误附加数据。  
└── 如果存在 error 对象，则第 2 个返回值为 error 对象的 JSON 文本格式。  
调用失败第一个返回值为 null ，第二个返回值为错误信息  

如果调用 rpc.beginTrans 函数开始一个批量调用，  
则返回一个可以指定 end 成员函数的对象，服务器应答时自动回调此 end 函数

## processRpcJsonClientObject.rpc 事件列表 <a id="processRpcJsonClientObject.rpcEvent" href="#processRpcJsonClientObject.rpcEvent">&#x23;</a>

### processRpcJsonClientObject.rpc.onError <a id="processRpcJsonClientObject.rpc.onError" href="#processRpcJsonClientObject.rpc.onError">&#x23;</a>

```aardio
processRpcJsonClientObject.rpc.onError = function(message){
	/*目标进程存在标准库错误输出时触发此函数*/
}
```

