/ / Thực hiện các yêu cầu HTTP trong Rust với Reqwest

Thực hiện các yêu cầu HTTP trong Rust với Reqwest

Giống như hầu hết các ngôn ngữ lập trình, bạn có thể sử dụng Rust để gửi và nhận dữ liệu qua HTTP. Khi xây dựng một dịch vụ dựa trên web, bạn thường cần tích hợp một hoặc nhiều dịch vụ. Bạn sẽ thường làm như vậy bằng cách gửi cho họ các yêu cầu HTTP.


Rust có chức năng tích hợp cho các hoạt động HTTP. Ngoài ra còn có nhiều thư viện trong hệ sinh thái Rust giúp bạn tương tác với HTTP và xây dựng các dịch vụ HTTP.


Thực hiện các yêu cầu HTTP với Rust

Một số thư viện Rust có sẵn để thực hiện các yêu cầu HTTP, bao gồm các thư viện Reqwest, Hyper và Surf. Reqwest là phổ biến nhất trong số các nhà phát triển Rust.

Xem trước liên kết Reqwest GitHub

Reqwest là thư viện máy khách cấp cao cung cấp API đơn giản và thuận tiện để thực hiện các yêu cầu HTTP. Reqwest cung cấp chức năng gửi yêu cầu và xử lý phản hồi cũng như lỗi. Nó tóm tắt nhiều chi tiết đằng sau việc tạo một yêu cầu HTTP và hỗ trợ các tính năng nâng cao như yêu cầu không đồng bộ bằng cách sử dụng tokio thời gian chạy. Nó cũng xử lý quá trình giải tuần tự hóa JSON, tiêu đề HTTP, thời gian chờ kết nối và cài đặt SSL.

Bạn sẽ thấy thư viện Reqwest hữu ích nếu bạn mới sử dụng Rust hoặc thiếu kinh nghiệm với các dịch vụ HTTP.

Để bắt đầu với Reqwest, hãy thêm thư viện Reqwest và Tokio vào phần phụ thuộc của dự án. Tokio là một thư viện thời gian chạy không đồng bộ tương tác với Reqwest. Bạn có thể thêm các phụ thuộc này vào Cargo.toml tệp sau khi tạo dự án Rust.

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

Khi bạn đã thêm các thư viện Reqwest và Tokio vào phần phụ thuộc của dự án, Cargo sẽ cài đặt chúng khi bạn xây dựng chương trình của mình.

Yêu cầu HTTP GET với Reqwest

Bạn sẽ thực hiện yêu cầu GET để truy xuất dữ liệu từ máy chủ web. Yêu cầu GET có thể truy xuất các trang HTML, dữ liệu JSON hoặc tệp nhị phân như hình ảnh hoặc video.

Reqwest cho phép bạn chỉ định điểm cuối URL dưới dạng chuỗi cùng với các tham số truy vấn và tiêu đề cho yêu cầu.

Đây là cách bạn có thể gửi yêu cầu HTTP GET tới một URL:

 use reqwest::Error;

async fn get_request() -> Result<(), Error> {
    let response = reqwest::get("https://www.example.com").await?;
    println!("Status: {}", response.status());

    let body = response.text().await?;
    println!("Body:n{}", body);

    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    get_request().await?;
    Ok(())
}

Mã này định nghĩa một chức năng không đồng bộ, get_request, để in chi tiết phản hồi từ một yêu cầu tới example.com. Nó gọi yêu cầu mô-đun lấy và in mã trạng thái và nội dung của phản hồi.

Đây là kết quả của việc gọi get_request chức năng từ chủ yếu chức năng:

Kết quả của yêu cầu GET sử dụng Rust hiển thị nội dung HTML của trang web

Xử lý lỗi HTTP với Reqwest

Bạn sẽ cần xử lý lỗi từ các yêu cầu HTTP khi chúng phát sinh. Thư viện Reqwest cung cấp một Lỗi loại mà bạn có thể sử dụng để xử lý lỗi. Ngoài ra, mã trạng thái HTTP từ máy chủ web có thể cung cấp thông tin về trạng thái của yêu cầu.

Đây là cách bạn có thể xử lý lỗi HTTP cho các yêu cầu của mình với Reqwest:

 use reqwest::Error;

async fn handle_error() -> Result<(), Error> {
    let response = reqwest::get("https://www.example.com").await?;

    match response.status().as_u16() {
        200..=299 => {
            let body = response.text().await?;
            println!("Success! Body:n{}", body);
        }
        400..=599 => {
            let status = response.status();
            let error_message = response.text().await?;
            println!("Error {}: {}", status, error_message);
        }
        _ => {
            println!("Unexpected status code: {}", response.status());
        }
    }

    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    handle_error().await?;
    Ok(())
}

Các handle_error hàm tạo yêu cầu GET tới example.com và câu lệnh so khớp xử lý bất kỳ lỗi nào dựa trên mã trạng thái phản hồi.

Hàm in một thông báo và mã trạng thái tùy thuộc vào phản hồi cho máy chủ.

Gửi yêu cầu HTTP POST với Reqwest

Bạn sẽ thực hiện các yêu cầu HTTP POST để gửi dữ liệu đến máy chủ. Bạn có thể làm như vậy bằng cách sử dụng yêu cầu::Khách hàng struct tạo một ứng dụng khách và sử dụng yêu cầu::RequestBuilder struct để xây dựng yêu cầu.

Đây là cách bạn có thể tạo một yêu cầu POST tới điểm cuối yêu cầu POST của HTTPbin với Reqwest:

 use reqwest::{Client, Error};

async fn post_it() -> Result<(), Error> {
    let url = "https://httpbin.org/post";
    let json_data = r#"{"name": "John Doe", "email": "john.doe@example.com"}"#;

    let client = reqwest::Client::new();

    let response = client
        .post(url)
        .header("Content-Type", "application/json")
        .body(json_data.to_owned())
        .send()
        .await?;

    println!("Status: {}", response.status());

    let response_body = response.text().await?;
    println!("Response body:n{}", response_body);

    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    post_it().await?;
    Ok(())
}

Các json_data biến xác định dữ liệu JSON cho yêu cầu và khách hàng biến là một yêu cầu::Khách hàng ví dụ cho yêu cầu POST.

Các phản ứng biến là trình tạo yêu cầu POST. Các bưu kiện phương thức gửi yêu cầu POST tới URL và tiêu đề phương thức đặt tiêu đề HTTP. Các thân hình phương thức đặt phần thân yêu cầu và gửi phương thức gửi yêu cầu.

Các post_it chức năng in mã trạng thái phản hồi và nội dung tới bàn điều khiển bằng cách sử dụng inln! vĩ mô:

Kết quả của yêu cầu POST sử dụng Rust hiển thị dữ liệu JSON

Xử lý tiêu đề và tham số truy vấn Yêu cầu HTTP của bạn

Xử lý các tiêu đề và tham số truy vấn là một khía cạnh quan trọng của việc thực hiện các yêu cầu HTTP. Tiêu đề chứa thông tin bổ sung như thông tin xác thực hoặc siêu dữ liệu về nội dung được yêu cầu.

Bạn sẽ sử dụng các tham số truy vấn để thêm thông tin bổ sung vào một URL để máy chủ lọc hoặc sửa đổi phản hồi.

Việc xử lý các tiêu đề và tham số truy vấn tuân theo quy trình tương tự như gửi yêu cầu bài đăng. Đây là cách bạn có thể xử lý các tiêu đề và tham số truy vấn trong các yêu cầu HTTP của mình với Reqwest:

 use std::collections::HashMap;
use reqwest::{ Error, header};

#[tokio::main]
async fn main() -> Result<(), Error> {
    headers_for_requests().await?;
    Ok(())
}

async fn headers_for_requests() -> Result<(), Error> {
    
    let url = "https://example.com/api";
    let mut headers = header::HeaderMap::new();
    headers.insert(header::USER_AGENT, header::HeaderValue::from_static("reqwest"));
    headers.insert(header::CONTENT_TYPE, header::HeaderValue::from_static("application/json"));

    
    let mut params = HashMap::new();
    params.insert("foo", "bar");
    params.insert("baz", "qux");

    
    let response = reqwest::Client::new()
        .get(url)
        .headers(headers)
        .query(&params)
        .send()
        .await?;

    
    println!("{:#?}", response);

    Ok(())
}

Bạn sẽ tạo một hashmap cho các tham số truy vấn mà sau đó bạn chuyển đến truy vấn phương pháp. Tạo một thể hiện của tiêu đề::Bản đồ tiêu đề gõ để thêm tiêu đề.

Các tiêu đề_for_requests gửi một yêu cầu GET tới example.com với nhiều tiêu đề và tham số truy vấn. Nó sử dụng tiêu đềtruy vấn các phương thức lấy bản đồ chứa các tiêu đề và tham số truy vấn tương ứng.

Bạn có thể xây dựng Full Stack WebApp trong Rust với WASM

Tạo các yêu cầu HTTP là một kỹ năng hữu ích để xây dựng các ứng dụng tinh vi tích hợp chức năng từ các ứng dụng khác.

Bạn có thể xây dựng các ứng dụng web full-stack trong Rust với các thư viện như Percy, Yew và Sycamore để trừu tượng hóa sự phức tạp nhằm mang lại trải nghiệm phát triển tuyệt vời.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *