币安API Rust async SDK
| 接口 | 现货 | U本位合约 | 币本位合约 | 欧式期权 | | --------- | ------- | --------- | ---------- | -------- | | http | 🚧开发中 | 🆗 | 🚧开发中 | 未开始 | | websocket | 🚧开发中 | 🆗 | 🚧开发中 | 未开始 |
在 Cargo.toml
中添加依赖
toml
[dependencies]
tokio = { version = "1", features = ["full"] }
bian-rs = { git = "https://github.com/PrivateRookie/bian-rs.git" }
在国内使用需要设置代理,bian-rs 通过 HTTP_PROXY
和 HTTPS_PROXY
环境变量自动
设置代理。
```rust use bian_rs::client::UFuturesHttpClient; use std::env;
async fn main() { let apikey = "your api key"; let secretkey = "your secret key"; // 注意末尾的 "/" 必不可少 let baseurl = "https://fapi.binance.com/"; let client = UFuturesHttpClient::new(apikey, secretkey, baseurl); // 测试是否连通 client.ping().await.unwrap(); } ```
```rust fn initclient() -> UFuturesWSClient { dotenv::dotenv().unwrap(); let proxy = env::var("WSPROXY").expect("cant not find WSPROXY env variable"); let proxy = Some(proxy.tosocketaddrs().unwrap().next().unwrap()); let baseurl = url::Url::parse(BASEURL).unwrap(); UFuturesWSClient { proxy, baseurl } }
fn testwskline() { let client = initclient(); let mut stream = client .kline("btcusdt".tostring(), enums::Interval::Min1) .unwrap(); for _ in 0..5 { dbg!(stream.readstreamsingle().unwrap()); } } ```
因为币安 API 接口众多,若是 bian-rs 还没有实现, 可能需要自己实现。
不过好在bian-rs 使用过程宏 bian-proc::api
辅助生成 API 请求函数,你只需要定义API
请求类型,返回数据类型,接着共通过 #[api(<http_verb> url)]
即可。
如获取账户余额。
首先在 src/params.rs
定义请求参数类型
```rust use serde::Serialize;
pub struct AccountBalanceV2 {
pub recv_window: Option
接着在 src/response.rs
定义返回数据类型
```rust
pub struct AccountBalance { pub accountalias: String, pub asset: String, #[serde(deserializewith = "stringasf64")] pub balance: f64, #[serde(deserializewith = "stringasf64")] pub crosswalletbalance: f64, #[serde(deserializewith = "stringasf64")] pub crossunpnl: f64, #[serde(deserializewith = "stringasf64")] pub availablebalance: f64, #[serde(deserializewith = "stringasf64")] pub maxwithdraw_amount: f64, } ```
币安返回的数据字段名为 camelCase, 需要通过 serde(rename_all)
将其重命名为符合 Rust lint 的 snake_case。
另外币安的某些数据是以字符的保存的浮点数或整数,可以通过 #[serde(deserialize_with = "string_as_f64")]
或 #[serde(deserialize_with = "string_as_usize")]
将其直接转换为 f64 或 usize。
接着在 impl UFuturesHttpClient
块中使用 api!
来实现函数。
api!
接受两个参数,http 方法和 url. http 方法除了 GET
, POST
, PUT
, DELETE
外,对于需要签名的请求,可以在前面加上 S
,如 SGET
。
```rust /// 账户余额V2
pub async fn accountbalancev2(
&self,
param: params::AccountBalanceV2,
) -> BianResult
接着编写测试用例,确保 url, 请求参数和返回值类型都已定义正确。
```rust
async fn testbalance() { let (apikey, secretkey) = inittest(); let client = UFuturesHttpClient::new(&apikey, &secretkey, BASEURL); let now = chrono::Utc::now(); let params = params::AccountBalanceV2 { timestamp: now.timestampmillis(), recvwindow: None, }; client.accountbalance_v2(params).await.unwrap(); } ```