1个不稳定版本
| 0.1.0 | 2023年1月20日 | 
|---|
#254在 HTTP客户端
23每月下载量
在3个crate中使用(通过ratmom)
435KB
 6K  SLoC
ratcurl
Rust的libcurl绑定,支持curl-impersonate。
基于[curl-rust]的分支
快速入门
use std::io::{stdout, Write};
use ratcurl::easy::Easy;
// Print a web page onto stdout
fn main() {
    let mut easy = Easy::new();
    easy.url("https://rust-lang.net.cn/").unwrap();
    easy.write_function(|data| {
        stdout().write_all(data).unwrap();
        Ok(data.len())
    }).unwrap();
    easy.perform().unwrap();
    println!("{}", easy.response_code().unwrap());
}
use ratcurl::easy::Easy;
// Capture output into a local `Vec`.
fn main() {
    let mut dst = Vec::new();
    let mut easy = Easy::new();
    easy.url("https://rust-lang.net.cn/").unwrap();
    let mut transfer = easy.transfer();
    transfer.write_function(|data| {
        dst.extend_from_slice(data);
        Ok(data.len())
    }).unwrap();
    transfer.perform().unwrap();
}
POST/PUT请求
Easy上的put和post方法可以配置HTTP请求的方法,然后可以使用read_function指定如何填充数据。此接口与实现Read的类型配合得很好。
use std::io::Read;
use ratcurl::easy::Easy;
fn main() {
    let mut data = "this is the body".as_bytes();
    let mut easy = Easy::new();
    easy.url("http://www.example.com/upload").unwrap();
    easy.post(true).unwrap();
    easy.post_field_size(data.len() as u64).unwrap();
    let mut transfer = easy.transfer();
    transfer.read_function(|buf| {
        Ok(data.read(buf).unwrap_or(0))
    }).unwrap();
    transfer.perform().unwrap();
}
自定义头部
自定义头部可以作为请求的一部分指定
use ratcurl::easy::{Easy, List};
fn main() {
    let mut easy = Easy::new();
    easy.url("http://www.example.com").unwrap();
    let mut list = List::new();
    list.append("Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==").unwrap();
    easy.http_headers(list).unwrap();
    easy.perform().unwrap();
}
长连接
句柄可以在多个请求之间重复使用。curl将尝试保持连接活跃。
use ratcurl::easy::Easy;
fn main() {
    let mut handle = Easy::new();
    handle.url("http://www.example.com/foo").unwrap();
    handle.perform().unwrap();
    handle.url("http://www.example.com/bar").unwrap();
    handle.perform().unwrap();
}
多个请求
libcurl库通过“multi”接口提供同时发送多个请求的支持。这目前绑定在此crate的multi模块中,并提供了同时执行多个传输的能力。有关更多信息,请参阅该模块。
构建
默认情况下,此crate将尝试动态链接到系统范围内的libcurl和系统范围内的SSL库。可以使用各种Cargo功能自定义一些此行为
- 
ssl:启用使用平台默认TLS后端的SSL/TLS支持。在Windows上是Schannel,在macOS上是Secure Transport,在其他平台上是OpenSSL(或等效)。默认启用。
- 
rustls:通过Rustls启用SSL/TLS支持,Rustls是一个受欢迎的替代TLS后端,用Rust编写。Rustls总是静态链接。默认禁用。请注意,Rustls在Curl内部的支持是实验性的,可能存在重大错误,所以我们不对此功能提供任何稳定性保证。 
- 
http2:通过libnghttp2启用HTTP/2支持。默认禁用。
- 
static-curl:使用捆绑的libcurl版本并将其静态链接。默认禁用。
- 
static-ssl:使用捆绑的OpenSSL版本并将其静态链接。仅适用于使用OpenSSL的平台。默认禁用。
- 
spnego:启用SPNEGO支持。默认禁用。
- 
upkeep_7_62_0:启用curl_easy_upkeep()支持,该支持自curl 7.62.0版本引入。默认禁用。
- 
poll_7_68_0:启用curl_multi_poll()/curl_multi_wakeup()支持,需要curl 7.68.0或更高版本。默认禁用。
- 
ntlm:在curl中启用NTLM支持。默认禁用。
- 
windows-static-ssl:通过vcpkg提供的静态构建启用Windows上的OpenSSL支持。与ssl(使用--no-default-features)不兼容。默认禁用。
- 
impersonate-chrome:在chrome版本中使用curl-impersonate。与static-curl不兼容,强制使用内置的BoringSSL作为TLS后端。
- 
impersonate-ff:在firefox版本中使用curl-impersonate。与static-curl不兼容,强制使用内置的NSS作为TLS后端。请注意,要通过vcpkg在Windows上安装openssl,需要运行以下命令 git clone https://github.com/microsoft/vcpkg cd vcpkg ./bootstrap-vcpkg.bat -disableMetrics ./vcpkg.exe integrate install ./vcpkg.exe install openssl:x64-windows-static-md
版本支持
这些绑定是使用curl版本7.24.0开发的。它们应该与任何新的curl版本兼容,也可能与旧版本兼容,但这尚未经过测试。
故障排除
curl使用NSS SSL库构建
如果您遇到以下错误消息
  [77] Problem with the SSL CA cert (path? access rights?)
这意味着curl可能是因为安装了libcurl NSS开发文件而链接到libcurl-nss.so,并且所需的库libnsspem.so缺失。有关更多信息,请参阅curl手册页:“如果curl是针对NSS SSL库构建的,则NSS PEM PKCS#11模块(libnsspem.so)需要可用,以便此选项正常工作。”
为了避免这种失败,您可以
- 安装缺失的库(例如,Debian:nss-plugin-pem),或者
- 移除libcurl NSS开发文件(例如,Debian:libcurl4-nss-dev)并重新构建curl-rust。
许可证
curl-rust存储库受MIT许可证的许可,有关详细信息,请参阅LICENSE。
依赖关系
~1–14MB
~173K SLoC