28个版本
0.4.3 | 2024年4月5日 |
---|---|
0.4.1 | 2024年3月6日 |
0.2.4 | 2023年10月29日 |
0.1.6 | 2023年5月15日 |
0.1.3 | 2023年3月26日 |
#94 在 HTTP客户端
每月186次下载
用于 2 包
125KB
1.5K SLoC
async-curl
通过使用Actor和tokio以异步方式执行rust-lang的curl Easy2
如何与多个异步请求一起使用
use async_curl::{Actor, CurlActor};
use curl::easy::{Easy2, Handler, WriteError};
#[derive(Debug, Clone, Default)]
pub struct ResponseHandler {
data: Vec<u8>,
}
impl Handler for ResponseHandler {
/// This will store the response from the server
/// to the data vector.
fn write(&mut self, data: &[u8]) -> Result<usize, WriteError> {
self.data.extend_from_slice(data);
Ok(data.len())
}
}
impl ResponseHandler {
/// Instantiation of the ResponseHandler
/// and initialize the data vector.
pub fn new() -> Self {
Self::default()
}
/// This will consumed the object and
/// give the data to the caller
pub fn get_data(self) -> Vec<u8> {
self.data
}
}
#[tokio::main(flavor = "current_thread")]
async fn main() {
let actor = CurlActor::new();
let mut easy2 = Easy2::new(ResponseHandler::new());
easy2.url("https://www.rust-lang.net.cn/").unwrap();
easy2.get(true).unwrap();
let actor1 = actor.clone();
let spawn1 = tokio::spawn(async move {
let mut result = actor1.send_request(easy2).await.unwrap();
let response = result.get_ref().to_owned().get_data();
let status = result.response_code().unwrap();
println!("Response: {:?}", response);
println!("Status: {:?}", status);
});
let mut easy2 = Easy2::new(ResponseHandler::new());
easy2.url("https://www.rust-lang.net.cn/").unwrap();
easy2.get(true).unwrap();
let spawn2 = tokio::spawn(async move {
let mut result = actor.send_request(easy2).await.unwrap();
let response = result.get_ref().to_owned().get_data();
let status = result.response_code().unwrap();
println!("Response: {:?}", response);
println!("Status: {:?}", status);
});
let (_, _) = tokio::join!(spawn1, spawn2);
}
依赖项
~10–19MB
~273K SLoC