use reqres::Client;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize)]
struct CreateUserRequest {
name: String,
job: String,
}
#[derive(Debug, Deserialize)]
struct CreateUserResponse {
name: String,
job: String,
id: String,
created_at: String,
}
#[derive(Debug, Deserialize)]
struct HttpBinResponse {
url: String,
origin: String,
headers: std::collections::HashMap<String, String>,
#[serde(default)]
json: Option<serde_json::Value>,
#[serde(default)]
data: String,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== reqres v0.4.0 JSON Client Demo ===\n");
let client = Client::new()?;
println!("Sending JSON POST request...");
let user = CreateUserRequest {
name: "John Doe".to_string(),
job: "Software Engineer".to_string(),
};
match client.post_json("https://httpbin.org/post", &user).await {
Ok(response) => {
println!("✓ JSON POST request successful!");
println!(" Status: {}", response.status());
match response.json::<HttpBinResponse>() {
Ok(data) => {
println!(" Parsed Response:");
println!(" URL: {}", data.url);
println!(" Origin: {}", data.origin);
if let Some(json) = data.json {
println!(" JSON Body: {}", serde_json::to_string_pretty(&json)?);
}
}
Err(e) => {
eprintln!(" Failed to parse JSON: {}", e);
}
}
}
Err(e) => {
eprintln!("✗ JSON POST request failed: {}", e);
}
}
println!("\n{}\n", &"=".repeat(50));
println!("Sending JSON using RequestBuilder...");
let json_body = serde_json::json!({
"title": "reqres v0.2.0",
"features": ["HTTPS", "JSON", "Redirects"],
"awesome": true
});
let request = reqres::Request::post("https://httpbin.org/post")
.json(&json_body)?
.header("X-Custom-Header", "reqres-demo")
.build()?;
match client.request(request).await {
Ok(response) => {
println!("✓ RequestBuilder JSON POST successful!");
println!(" Status: {}", response.status());
if let Ok(text) = response.text() {
let preview = if text.len() > 300 {
&text[..300]
} else {
&text
};
println!(" Body preview:\n{}", preview);
}
}
Err(e) => {
eprintln!("✗ RequestBuilder request failed: {}", e);
}
}
println!("\n=== Demo completed ===");
Ok(())
}