Enviando uma requisição HTTP

Rust:
Enviando uma requisição HTTP

Como fazer:

Para enviar uma requisição HTTP em Rust, você pode usar a crate reqwest, que simplifica a maioria das tarefas de networking. Primeiro, adicione a crate ao seu Cargo.toml:

[dependencies]
reqwest = "0.11"
tokio = { version = "1", features = ["full"] }

E aqui está um exemplo de como você pode usar reqwest para fazer uma requisição GET:

use reqwest::Error;

#[tokio::main]
async fn main() -> Result<(), Error> {
    let res = reqwest::get("http://httpbin.org/get").await?;
    
    println!("Status: {}", res.status());
    println!("Headers:\n{:#?}", res.headers());
    
    let body = res.text().await?;
    println!("Body:\n{}", body);
    
    Ok(())
}

Saída de exemplo:

Status: 200 OK
Headers:
{
    "content-type": "application/json",
    ...
}
Body:
{
  "args": {},
  "headers": {
    "Host": "httpbin.org",
    ...
  },
  "origin": "..."
}

Mergulho Profundo:

A declaração de #[tokio::main] prepara o cenário para o uso de async-await, que é essencial em operações que podem bloquear, como solicitações de rede. Historicamente, alternativas como hyper exigiam mais configuração e detalhes da implementação, mas reqwest abstrai isso, oferecendo uma interface simples. A biblioteca passou por várias iterações e melhorias de desempenho ao longo dos anos, o que reflete a evolução do async Rust.

Falando em alternativas, além de reqwest, há outras crates que você pode explorar, como hyper (para quem precisa de controle detalhado) e surf (uma opção mais recente que só suporta async).

Quanto a implementação, é importante entender como reqwest lida com assincronia, que permite ao Rust realizar outras tarefas enquanto espera a resposta de uma requisição. Isso é feito por meio de um runtime async, geralmente fornecido pelo tokio. Sem ele, você teria de lidar com muita complexidade de baixo nível de I/O e concorrência.

Veja Também:

Para se aprofundar mais na biblioteca reqwest e suas capacidades:

Para entender os conceitos de async-await no Rust:

Para uma visão geral do ecossistema de solicitações de rede em Rust, incluindo o hyper e surf: