Cliente HTTP em Rust: fazendo requisições corretamente

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course
```html

Cliente HTTP em Rust: fazendo requisições corretamente



Rust é uma linguagem de programação de sistemas moderna que combina a performance do C++ com a segurança de memória. Ao desenvolver aplicações web, microsserviços ou ferramentas de linha de comando, frequentemente surge a necessidade de interagir com APIs externas. Neste artigo, vamos explorar como criar um cliente HTTP em Rust, usando os populares crates reqwest e ureq. Você aprenderá como enviar requisições GET e POST, tratar erros e trabalhar com JSON.



Por que Rust para requisições HTTP?



Rust oferece vantagens únicas para trabalhar com rede:



  • Segurança de memória — o compilador garante a ausência de vazamentos e condições de corrida.
  • Alta performance — velocidade comparável a C/C++.
  • Assincronicidade — suporte nativo a async/await para trabalho eficiente com I/O.
  • Ecossistema de crates — milhares de bibliotecas prontas, incluindo clientes HTTP.


Para trabalhar com HTTP em Rust, existem duas abordagens principais: síncrona (bloqueante) e assíncrona (não bloqueante). Vamos abordar ambas.



Configuração do projeto e escolha do crate



Vamos criar um novo projeto Rust:



cargo new rust-http-clientcd rust-http-client


Abra o arquivo Cargo.toml e adicione as dependências:



[dependencies]# Para requisições assíncronasreqwest = { version = "0.12", features = ["json"] }tokio = { version = "1", features = ["full"] }

# Para requisições síncronas (alternativa)ureq = "2.9"


Comparação dos crates:



  • reqwest — o cliente HTTP mais popular. Suporta assincronicidade, JSON, cookies, proxy.
  • ureq — um cliente síncrono leve. Ideal para scripts simples e ferramentas CLI.


1. Requisição GET com reqwest (assíncrona)



Vamos começar com uma requisição GET assíncrona. Crie o arquivo src/main.rs:



use reqwest;use std::error::Error;

#[tokio::main]async fn main() -> Result<(), Box<dyn Error>> { // Envia uma requisição GET let response = reqwest::get("https://api.github.com/repos/rust-lang/rust") .await? .text() .await?;

println!("Resposta da API do GitHub:"); println!("{}", &response[..500]); // Exibe os primeiros 500 caracteres

Ok(())}


Explicação:



  • #[tokio::main] — macro para iniciar o runtime assíncrono Tokio.
  • reqwest::get() — envia uma requisição GET e retorna uma Response.
  • .await? — aguarda a conclusão da operação e trata erros.
  • .text() — extrai o corpo da resposta como string.


Execute o projeto:



cargo run


Você verá a resposta JSON da API do GitHub.



2. Requisição POST com JSON (reqwest)



Agora vamos enviar uma requisição POST com corpo em formato JSON:



use reqwest;use serde::{Deserialize, Serialize};use std::error::Error;

#[derive(Serialize, Deserialize, Debug)]struct Post { title: String, body: String, user_id: u32,}

#[derive(Deserialize, Debug)]struct CreatedPost { id: u32, title: String,}

#[tokio::main]async fn main() -> Result<(), Box<dyn Error>> { // Cria um cliente com configurações let client = reqwest::Client::new();

// Dados para enviar let new_post = Post { title: "Cliente HTTP em Rust".to_string(), body: "Guia completo para trabalhar com HTTP em Rust".to_string(), user_id: 1, };

// Envia uma requisição POST let response = client .post("https://jsonplaceholder.typicode.com/posts") .json(&new_post) .send() .await?;

// ```

Blogs

Book Recommendations