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://www.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://www.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