32个版本
0.11.1 | 2022年3月15日 |
---|---|
0.10.5 | 2021年12月29日 |
0.10.1 | 2021年3月10日 |
1296 在 编码
每月下载量 337
在 5 crates 中使用
26KB
564 行
JSON-RPC
为Rust实现的简单、实用的JSONRPC-2.0,它不依赖于传输方式,并严格遵循规范。
使用async-trait特性标志可以获得非阻塞支持,请参阅Request的示例
cargo run --example hello-world
cargo run --example async
双许可下MIT和Apache-2。
lib.rs
:
简单、健壮且实用的JSON-RPC2服务门面,不依赖于传输方式。
use json_rpc2::*;
use serde_json::Value;
struct ServiceHandler;
impl Service for ServiceHandler {
type Data = ();
fn handle(&self, request: &Request, _ctx: &Self::Data) -> Result<Option<Response>> {
let response = match request.method() {
"hello" => {
let params: String = request.deserialize()?;
let message = format!("Hello, {}!", params);
Some((request, Value::String(message)).into())
}
_ => None
};
Ok(response)
}
}
fn main() -> Result<()> {
let service: Box<dyn Service<Data = ()>> = Box::new(ServiceHandler {});
let request = Request::new_reply(
"hello", Some(Value::String("world".to_string())));
let server = Server::new(vec![&service]);
let response = server.serve(&request, &());
assert_eq!(
Some(Value::String("Hello, world!".to_string())),
response.unwrap().into());
Ok(())
}
解析
当从传入的有效载荷转换时,使用from_*
函数将JSON转换为Request,以便正确映射错误。
上下文
对于大多数应用程序,用户数据可以被分配到实现Service
特征的struct中,但有时您可能需要从回调函数中处理请求,该回调函数传递您想要公开给服务方法的有关信息。使用Data = T
与自定义类型来公开用户数据,这些数据在创建服务时不可用。
异步
为了获得非阻塞支持,请启用async
特性,并使用async-trait crate中的Service
特征。您还需要依赖于async-trait crate,并在您的服务实现上使用#[async_trait]
属性宏。
请参阅Request的示例。
依赖项
~0.9–1.7MB
~37K SLoC