Blocking HTTP GET request with ureq
ureq was recommended as a better alternative to reqwest for blocking requests.
In this example we'll see how to use it to send a simple GET request.
Dependencies
[package]
name = "get"
version = "0.1.0"
edition = "2024"
[dependencies]
ureq = "3.1.2"
Code
get_url just gets the url from the command line
We get a response that can be either a good response or an error. In case of a good response we can print the content of the response.
Success
$ cargo run http://localhost/get
GET request to: http://localhost/get
Status: 200 OK
------- Headers --------
server: "gunicorn/19.9.0"
date: "Tue, 14 Oct 2025 10:07:54 GMT"
connection: "keep-alive"
content-type: "application/json"
content-length: "210"
access-control-allow-origin: "*"
access-control-allow-credentials: "true"
------- Body --------
Body: {
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip",
"Host": "localhost",
"User-Agent": "ureq/3.1.2"
},
"origin": "172.17.0.1",
"url": "http://localhost/get"
}
404 status code
$ cargo run -q http://localhost/status/404
GET request to: http://localhost/status/404
Error: http status: 404
500 status code
$ cargo run -q http://localhost/status/500
GET request to: http://localhost/status/500
Error: http status: 500
Redirect:
This will follow the redirect and thus it will print out the content of the target web site.
$ cargo run "http://localhost/redirect-to?url=https://rust.code-maven.com/&status_code=301"
fn main() { let url = get_url(); println!("GET request to: {}", url); let response = ureq::get(&url).call(); match response { Ok(mut resp) => { println!("Status: {}", resp.status()); println!("------- Headers --------"); resp.headers_mut().iter().for_each(|(k, v)| { println!("{}: {:?}", k, v); }); println!("------- Body --------"); let body = resp.body_mut(); if let Ok(content) = body.read_to_string() { println!("Body: {content}"); } else { eprintln!("Failed to read response body"); return; }; } Err(err) => { eprintln!("Error: {}", err); } } } fn get_url() -> String { let args = std::env::args().collect::<Vec<String>>(); if args.len() < 2 { eprintln!("Usage: {} <URL>", args[0]); std::process::exit(1); } args[1].clone() }