1 个稳定版本

2.1.0 2021年2月13日

#64 in #async-std

MIT/Apache

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