#json-rpc #json #rpc #serde-json

json-rpc2

简单、健壮且实用的JSON-RPC 2.0实现

32个版本

0.11.1 2022年3月15日
0.10.5 2021年12月29日
0.10.1 2021年3月10日

1296编码

Download history 25/week @ 2024-03-14 14/week @ 2024-03-21 32/week @ 2024-03-28 28/week @ 2024-04-04 36/week @ 2024-04-11 122/week @ 2024-04-18 201/week @ 2024-04-25 105/week @ 2024-05-02 35/week @ 2024-05-09 83/week @ 2024-05-16 73/week @ 2024-05-23 76/week @ 2024-05-30 118/week @ 2024-06-06 114/week @ 2024-06-13 64/week @ 2024-06-20 23/week @ 2024-06-27

每月下载量 337
5 crates 中使用

MIT/Apache

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