Flutter JSON-RPC客户端插件json_rpc_2_nats的使用
Flutter JSON-RPC客户端插件json_rpc_2_nats的使用
服务器端(Server)
一个JSON-RPC 2.0 Nats服务器会暴露一组可以被客户端调用的方法。这些方法可以通过 Server.registerMethod
来注册。
import 'package:dart_nats/dart_nats.dart' as nats;
import 'package:json_rpc_2/json_rpc_2.dart';
import 'package:stream_channel/stream_channel.dart';
void main() {
// 创建NATS客户端并连接到服务器
var client = nats.Client();
client.connect(Uri.parse('nats://localhost:4222'));
// 订阅一个主题
var subscription = client.sub('my.subject');
// 创建一个服务器实例
var server = Server(subscription.stream.cast<String>() as StreamChannel<String>);
// 注册一个无参数的方法
var i = 0;
server.registerMethod('count', () {
// 返回一个值,该值将作为对客户端的响应发送。它可以是任何可以JSON序列化的对象,或者是一个完成为可JSON序列化对象的Future。
return i++;
});
// 注册一个带参数的方法
server.registerMethod('echo', (Parameters params) {
// 如果请求中没有 "message" 参数,这将自动向客户端发送一个响应,通知请求无效。
return params['message'].value;
});
// 使用Parameters类验证参数类型
server.registerMethod('subtract', (Parameters params) {
// 如果 "minuend" 或 "subtrahend" 不是数字,这将拒绝请求。
return params['minuend'].asNum - params['subtrahend'].asNum;
});
// Parameters类也支持可选参数
server.registerMethod('sort', (Parameters params) {
var list = params['list'].asList;
list.sort();
if (params['descending'].asBoolOr(false)) {
return list.reversed;
} else {
return list;
}
});
// 方法可以通过抛出RpcException来发送错误响应。任何正数都可以用作应用程序定义的错误代码。
const divideByZero = 1;
server.registerMethod('divide', (Parameters params) {
var divisor = params['divisor'].asNum;
if (divisor == 0) {
throw RpcException(divideByZero, 'Cannot divide by zero.');
}
return params['dividend'].asNum / divisor;
});
// 为了让您有时间注册所有方法,服务器不会开始监听请求,直到您调用 `listen`。消息在 `listen` 被调用之前会被缓冲。返回的Future将在连接关闭时完成。
server.listen();
}
客户端(Client)
一个JSON-RPC 2.0 Nats客户端调用服务器上的方法,并处理服务器对这些方法调用的响应。这些方法可以通过 Client.sendRequest
来调用。
import 'dart:async';
import 'package:dart_nats/dart_nats.dart' as nats;
import 'package:json_rpc_2/json_rpc_2.dart';
import 'package:stream_channel/stream_channel.dart';
void main() async {
// 创建NATS客户端并连接到服务器
var natsClient = nats.Client();
await natsClient.connect(Uri.parse('nats://localhost:4222'));
// 订阅一个主题
var subscription = natsClient.sub('my.subject');
// 创建一个客户端实例
var client = Client(subscription.stream.cast<String>() as StreamChannel<String>);
// 客户端不会订阅输入流,直到您调用 `listen`。返回的Future将在连接关闭时完成。
unawaited(client.listen());
// 调用服务器上的 "count" 方法。返回一个Future,该Future将在服务器响应中包含的值完成。
var count = await client.sendRequest('count');
print('Count is $count');
// 参数作为简单的Map或位置参数的Iterable传递。确保它们是JSON-可序列化的!
var echo = await client.sendRequest('echo', {'message': 'hello'});
print('Echo says "$echo"!');
// 通知是一种调用方法的方式,告诉服务器不期望结果。它的返回类型是 `void`;即使它导致错误,你也不会收到回音。
client.sendNotification('count');
// 如果服务器发送错误响应,返回的Future将以RpcException完成。您可以捕获此错误并检查其错误代码、消息以及服务器随附的任何数据。
try {
await client.sendRequest('divide', {'dividend': 2, 'divisor': 0});
} on RpcException catch (error) {
print('RPC error ${error.code}: ${error.message}');
}
}
更多关于Flutter JSON-RPC客户端插件json_rpc_2_nats的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复