22个版本 (9 个稳定版)

2.3.2 2021年11月1日
2.2.0 2021年3月2日
2.1.0 2020年10月23日
2.0.0-alpha.42020年6月5日
0.0.10 2019年4月18日

HTTP客户端 中排名 163

Download history 12589/week @ 2024-03-14 16563/week @ 2024-03-21 13840/week @ 2024-03-28 16311/week @ 2024-04-04 14555/week @ 2024-04-11 17885/week @ 2024-04-18 13357/week @ 2024-04-25 14375/week @ 2024-05-02 15893/week @ 2024-05-09 23407/week @ 2024-05-16 16039/week @ 2024-05-23 14824/week @ 2024-05-30 17021/week @ 2024-06-06 17597/week @ 2024-06-13 16286/week @ 2024-06-20 9033/week @ 2024-06-27

每月下载量 63,114
被少于 228 个包使用

MIT/Apache

120KB
1.5K SLoC

Surf

畅游网络

http-rs 团队 使用 🌊 构建

畅游网络 - HTTP客户端框架

Surf 是一个为易用性和多HTTP后端灵活性而构建的 Rust HTTP客户端。无论是快速脚本还是跨平台 SDK,Surf 都能使其工作。

  • 通过强大的中间件系统进行扩展
  • 可以选择多个 HTTP 后端
  • 通过可配置的 Client 接口重用连接
  • 完全流式请求和响应
  • 默认启用 TLS (原生 TLS 或 rustls)
  • 基于 async-std (可选 tokio 支持)

示例

let mut res = surf::get("https://httpbin.org/get").await?;
dbg!(res.body_string().await?);

也可以跳过中间的 Response,直接访问响应类型。

dbg!(surf::get("https://httpbin.org/get").recv_string().await?);

发送和接收 JSON 也非常简单。

#[derive(Deserialize, Serialize)]
struct Ip {
    ip: String
}

let uri = "https://httpbin.org/post";
let data = &Ip { ip: "129.0.0.1".into() };
let res = surf::post(uri).body_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);

甚至创建流式代理也不是问题。

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?;

在客户端上设置配置也很简单。

use std::convert::TryInto;
use std::time::Duration;
use surf::{Client, Config};
use surf::Url;

let client: Client = Config::new()
    .set_base_url(Url::parse("http://example.org")?)
    .set_timeout(Some(Duration::from_secs(5)))
    .try_into()?;

let mut res = client.get("/").await?;
println!("{}", res.body_string().await?);

特性

以下特性可用。默认特性为 curl-clientmiddleware-loggerencoding

  • curl-client (默认): 使用 curl (通过 isahc) 作为 HTTP 后端。
  • h1-client: 使用 async-h1 作为 HTTP 后端,并使用原生 TLS 进行 HTTPS。
  • h1-client-rustls: 使用 async-h1 作为 HTTP 后端,并通过 rustls 实现HTTPS。
  • hyper-client: 使用 hyper (hyper.rs) 作为 HTTP 后端。
  • wasm-client: 使用 window.fetch 作为 HTTP 后端。
  • middleware-logger (默认): 启用通过中间件记录请求和响应。
  • encoding (默认): 启用对除了utf-8之外的身体编码的支持。

安装

安装 OpenSSL -

  • Ubuntu - sudo apt install libssl-dev
  • Fedora - sudo dnf install openssl-devel

使用 rustup update 确保您的 rust 是最新的。

如果已安装 cargo add

$ cargo add surf

安全性

此 crate 使用单个实例的 unsafe 以使 WASM 后端能够工作,尽管存在 Send 边界。这是安全的,因为 WASM 目标目前无法访问线程。一旦它们可以,我们将能够丢弃此实现,并使用挂起的线程,并在过程中实现完整的多线程。

贡献

想加入我们吗?查看我们的 "贡献" 指南 并查看一些这些问题

另请参阅

谢谢

特别感谢 prasannavl 捐赠 crate 名称,以及 sagebind 创建了一个易于使用的 async curl 客户端,为我们节省了无数小时。

许可

MIT OR Apache-2.0

依赖关系

~7–26MB
~455K SLoC