1 个稳定版本
2.1.0 | 2021年2月13日 |
---|
#64 in #async-std
99KB
1K SLoC
Surf
网页冲浪
由 http-rs 团队 使用 🌊 构建
Surf 是一个友好的HTTP客户端,适用于初学者和资深人士。它是完全模块化的,专为 async/await
构建。无论是快速脚本还是跨平台SDK,Surf都能让它们工作。
- 开箱即用的多平台支持
- 通过强大的中间件系统进行扩展
- 通过
Client
接口重用连接 - 完全流式传输请求和响应
- 默认启用TLS/SSL
- 可交换的HTTP后端
- 默认启用HTTP/2
示例
#[async_std::main]
async fn main() -> surf::Result<()> {
let mut res = surf::get("https://httpbin.org/get").await?;
dbg!(res.body_string().await?);
Ok(())
}
还可以跳过中间的 Response
,直接访问响应类型。
#[async_std::main]
async fn main() -> surf::Result<()> {
dbg!(surf::get("https://httpbin.org/get").recv_string().await?);
Ok(())
}
发送和接收JSON也非常简单。
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize)]
struct Ip {
ip: String
}
#[async_std::main]
async fn main() -> surf::Result<()> {
let uri = "https://httpbin.org/post";
let data = &Ip { ip: "129.0.0.1".into() };
let res = surf::post(uri).body(surf::Body::from_json(data)?).await?;
assert_eq!(res.status(), 200);
let uri = "https://api.ipify.org?format=json";
let Ip { ip } = surf::get(uri).recv_json().await?;
assert!(ip.len() > 10);
Ok(())
}
甚至创建流式代理也不是问题。
#[async_std::main]
async fn main() -> surf::Result<()> {
let req = surf::get("https://img.fyi/q6YvNqP").await?;
let body = surf::http::Body::from_reader(req, None);
let res = surf::post("https://box.rs/upload").body(body).await?;
Ok(())
}
安装
安装OpenSSL -
- Ubuntu -
sudo apt install libssl-dev
- Fedora -
sudo dnf install openssl-devel
使用: rustup update
确保Rust是最新的
安装了 cargo add 后
$ cargo add surf
安全性
此包使用单个实例的 unsafe
以使 WASM 后端能够在存在 Send
约束的情况下工作。这是安全的,因为当前 WASM 目标没有访问线程的能力。一旦它们做到了,我们将能够丢弃这个实现,并使用挂起的线程,并在过程中转向完整的多线程。
贡献
想要加入我们吗?查看我们的 "贡献" 指南 并查看一些这些问题
另请参阅
谢谢
特别感谢 prasannavl 赞助包名,以及 sagebind 为我们创建了一个易于使用的 async
cURL 客户端,为我们节省了无数小时。
许可
MIT OR Apache-2.0
依赖
~7–24MB
~409K SLoC