use reqres::Client;
use bytes::Bytes;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== reqres v0.4.0 Bytes Client Demo ===\n");
let client = Client::new()?;
println!("Sending binary data using body_bytes()...");
let binary_data = Bytes::from_static(b"Hello, reqres! This is binary data.");
let request = reqres::Request::post("https://httpbin.org/post")
.body_bytes(binary_data.clone())
.header("X-Content-Type", "application/octet-stream")
.build()?;
match client.request(request).await {
Ok(response) => {
println!("✓ Binary data POST successful!");
println!(" Status: {}", response.status());
let body_bytes = response.bytes();
println!(" Response body length: {} bytes", body_bytes.len());
if let Ok(text) = String::from_utf8(body_bytes[0..300.min(body_bytes.len())].to_vec()) {
println!(" Response preview:\n{}", text);
}
}
Err(e) => {
eprintln!("✗ Binary data POST failed: {}", e);
}
}
println!("\n{}\n", &"=".repeat(50));
println!("Demonstrating zero-copy Bytes sharing...");
let shared_data = Bytes::from("Shared data between requests");
println!(" Original data: {:?}", shared_data);
println!(" Original data length: {} bytes", shared_data.len());
let request1_data = shared_data.clone();
let request2_data = shared_data.clone();
println!(" Cloned data length (same as original): {} bytes", request1_data.len());
println!(" ✓ Bytes::clone() is efficient - only copies the pointer, not the data");
let request1 = reqres::Request::post("https://httpbin.org/post")
.body_bytes(request1_data)
.build()?;
match client.request(request1).await {
Ok(response) => {
println!("✓ Request 1 with shared Bytes successful!");
println!(" Status: {}", response.status());
}
Err(e) => {
eprintln!("✗ Request 1 failed: {}", e);
}
}
let request2 = reqres::Request::post("https://httpbin.org/post")
.body_bytes(request2_data)
.build()?;
match client.request(request2).await {
Ok(response) => {
println!("✓ Request 2 with same Bytes successful!");
println!(" Status: {}", response.status());
}
Err(e) => {
eprintln!("✗ Request 2 failed: {}", e);
}
}
println!("\n{}\n", &"=".repeat(50));
println!("Performance comparison: String vs Bytes...");
let text_body = "Data sent as String".repeat(100);
let _start = std::time::Instant::now();
let request_text = reqres::Request::post("https://httpbin.org/post")
.body(text_body.clone())
.build()?;
match client.request(request_text).await {
Ok(response) => {
println!("✓ String body POST successful!");
println!(" Status: {}", response.status());
}
Err(e) => {
eprintln!("✗ String body POST failed: {}", e);
}
}
let bytes_body = Bytes::from("Data sent as Bytes".repeat(100));
let request_bytes = reqres::Request::post("https://httpbin.org/post")
.body_bytes(bytes_body.clone())
.build()?;
match client.request(request_bytes).await {
Ok(response) => {
println!("✓ Bytes body POST successful!");
println!(" Status: {}", response.status());
}
Err(e) => {
eprintln!("✗ Bytes body POST failed: {}", e);
}
}
println!("\n=== Demo completed ===");
Ok(())
}