3 个不稳定版本

0.2.0 2024 年 4 月 9 日
0.1.1 2024 年 4 月 4 日
0.1.0 2024 年 4 月 2 日

#244 in HTTP 客户端

Download history 17/week @ 2024-04-22 1/week @ 2024-05-13 5/week @ 2024-05-20 30/week @ 2024-05-27 34/week @ 2024-06-03 34/week @ 2024-06-10 66/week @ 2024-06-17 40/week @ 2024-06-24 79/week @ 2024-07-01 16/week @ 2024-07-08 42/week @ 2024-07-15 2/week @ 2024-07-22 3/week @ 2024-07-29 23/week @ 2024-08-05

每月 71 次下载

MIT/Apache

19KB
438 代码行

reqwest-enum

crates.io CI

类型安全且具有枚举风格的 Rust API,一些好处

  1. 它抽象掉了重复的样板代码,如 URL 格式化、查询/头编码和响应反序列化。
  2. 类型安全的端点,可读性强,像规范一样,易于添加新端点或重构现有端点。
  3. 默认异步且轻量级 JSON-RPC 支持。

特性

  • 类型安全和枚举风格的 HTTP API
  • 支持批处理的 JSON-RPC
  • ...

安装

cargo add reqwest-enum 或将其添加到您的 Cargo.toml

[dependencies]
reqwest-enum = "0.2.0"

示例

httpbin.org

  1. 将 https://httbin.org 作为枚举定义端点
pub enum HttpBin {
    Get,
    Post,
    Bearer,
}
  1. 为枚举实现 Target
pub trait Target {
    fn base_url(&self) -> &'static str;
    fn method(&self) -> HTTPMethod;
    fn path(&self) -> &'static str;
    fn query(&self) -> HashMap<&'static str, &'static str>;
    fn headers(&self) -> HashMap<&'static str, &'static str>;
    fn authentication(&self) -> Option<AuthMethod>;
    fn body(&self) -> HTTPBody;
}
  1. 创建提供者和请求
let provider = Provider::<HttpBin>::default();
let response = provider.request(HttpBin::Get).await.unwrap();
assert_eq!(response.status(), 200);

JSON-RPC

完整示例请见 examples/ethereum-rpc

  1. 将以太坊 JSON-RPC 方法定义为枚举
pub enum EthereumRPC {
    ChainId,
    GasPrice,
    BlockNumber,
    GetBalance(&'static str),
    GetBlockByNumber(&'static str, bool),
    GetTransactionCount(&'static str, BlockParameter),
    Call(TransactionObject, BlockParameter),
    EstimateGas(TransactionObject),
    SendRawTransaction(&'static str),
}
  1. 为枚举实现 TargetJsonRpcTarger
pub trait JsonRpcTarget: Target {
    fn method_name(&self) -> &'static str;
    fn params(&self) -> Vec<Value>;
}
  1. 创建提供者和请求
let provider = Provider::<EthereumRPC>::default();
let response: JsonRpcResponse<String> =
    provider.request_json(EthereumRPC::ChainId).await.unwrap();
assert_eq!(response.result, "0x1");

许可证

MITApache-2.0

致谢

依赖关系

~4–17MB
~212K SLoC