대부분의 프로그래밍 언어와 마찬가지로 Rust를 사용하여 HTTP를 통해 데이터를 주고받을 수 있습니다. 웹 기반 서비스를 구축할 때 하나 이상의 서비스를 통합해야 하는 경우가 많습니다. 이러한 통합은 종종 HTTP 요청을 전송하는 방식으로 이루어집니다.

Rust에는 HTTP 연산을 위한 기능이 내장되어 있습니다. 또한 Rust 에코시스템에는 HTTP와 상호 작용하고 HTTP 서비스를 구축하는 데 도움이 되는 많은 라이브러리가 있습니다.

Rust로 HTTP 요청하기

Reqwest , Hyper , Surf 라이브러리를 포함한 여러 Rust 라이브러리를 사용하여 HTTP 요청을 할 수 있습니다. Reqwest는 Rust 개발자들 사이에서 가장 인기 있는 라이브러리입니다.

Reqwest는 HTTP 요청을 위한 간단하고 편리한 API를 제공하는 고수준 클라이언트 라이브러리입니다. Reqwest는 요청을 전송하고 응답 및 오류를 처리하는 기능을 제공합니다. HTTP 요청을 만드는 데 필요한 많은 세부 사항을 추상화하며, 토큰 런타임을 사용해 비동기 요청과 같은 고급 기능을 지원합니다. 또한 JSON 역직렬화, HTTP 헤더, 연결 시간 초과 및 SSL 설정도 처리합니다.

Rust를 처음 사용하거나 HTTP 서비스에 대한 경험이 부족하다면 Reqwest 라이브러리가 유용할 것입니다.

Reqwest를 시작하려면 프로젝트의 종속성에 Reqwest 및 Tokio 라이브러리를 추가하세요. Tokio는 Reqwest와 상호 운용되는 비동기 런타임 라이브러리입니다. Rust 프로젝트를 생성한 후 Cargo.toml 파일에 이러한 종속성을 추가할 수 있습니다.

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

프로젝트의 종속성에 Reqwest 및 Tokio 라이브러리를 추가하면, 프로그램을 빌드할 때 Cargo가 해당 라이브러리를 설치합니다.

Reqwest를 사용한 HTTP GET 요청

웹 서버에서 데이터를 검색하기 위해 GET 요청을 할 것입니다. GET 요청은 HTML 페이지, JSON 데이터 또는 이미지나 동영상과 같은 바이너리 파일을 검색할 수 있습니다.

Reqwest를 사용하면 요청에 대한 쿼리 매개변수 및 헤더와 함께 URL 엔드포인트를 문자열로 지정할 수 있습니다.

HTTP GET 요청을 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(())
}

이 코드는 요청에서 example.com으로 응답 세부 정보를 인쇄하는 비동기 함수 get_request를 정의합니다. 이 코드는 reqwest 모듈의 get 메서드를 호출하고 응답의 상태 코드와 본문을 인쇄합니다.

이 글도 확인해 보세요:  개발자와 디자이너를 위한 10가지 UI/UX 영감 사이트

다음은 메인 함수에서 get_request 함수를 호출한 결과입니다:

Reqwest로 HTTP 오류 처리하기

HTTP 요청에서 오류가 발생하면 이를 처리해야 합니다. Reqwest 라이브러리는 오류를 처리하는 데 사용할 수 있는 오류 유형을 제공합니다. 또한 웹 서버의 HTTP 상태 코드는 요청의 상태에 대한 정보를 제공할 수 있습니다.

Reqwest를 사용하여 요청에 대한 HTTP 오류를 처리하는 방법은 다음과 같습니다.

 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(())
}

handle_error 함수는 example.com 으로 GET 요청을 하고 match 문은 응답 상태 코드에 따라 오류를 처리합니다.

이 함수는 서버의 응답에 따라 메시지와 상태 코드를 출력합니다.

Reqwest로 HTTP POST 요청 보내기

서버에 데이터를 제출하기 위해 HTTP POST 요청을 할 수 있습니다. 클라이언트를 생성하는 reqwest::Client 구조체를 사용하여 요청을 생성하고, 요청을 빌드하는 reqwest::RequestBuilder 구조체를 사용하여 요청을 빌드할 수 있습니다.

다음은 Reqwest를 사용하여 HTTPbin의 POST 요청 엔드포인트 에 POST 요청을 보내는 방법입니다.

 use reqwest::{Client, Error};

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

    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(())
}

json_data 변수는 요청에 대한 JSON 데이터를 정의하고 클라이언트 변수는 POST 요청에 대한 reqwest::Client 인스턴스입니다.

응답 변수는 POST 요청 빌더입니다. post 메서드는 POST 요청을 URL로 전송하고 header 메서드는 HTTP 헤더를 설정합니다. body 메서드는 요청 본문을 설정하고 send 메서드는 요청을 전송합니다.

이 글도 확인해 보세요:  HTTP와 HTTPS: 차이점은 무엇인가요?

post_it 함수는 println! 매크로를 사용하여 응답 상태 코드와 본문을 콘솔에 인쇄합니다:

헤더 및 쿼리 매개변수 처리하기 HTTP 요청

헤더와 쿼리 매개변수를 처리하는 것은 HTTP 요청의 중요한 측면입니다. 헤더에는 인증 자격 증명이나 요청된 콘텐츠에 대한 메타데이터와 같은 추가 정보가 포함됩니다.

쿼리 매개변수를 사용하여 서버가 응답을 필터링하거나 수정할 수 있도록 URL에 추가 정보를 추가할 수 있습니다.

헤더 및 쿼리 매개변수 처리는 글 요청 전송과 유사한 프로세스를 따릅니다. 다음은 Reqwest를 사용하여 HTTP 요청에서 헤더와 쿼리 매개변수를 처리하는 방법입니다.

 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> {
    // Set up the URL and headers for the request
    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"));

    // Set up the query parameters for the request
    let mut params = HashMap::new();
    params.insert("foo", "bar");
    params.insert("baz", "qux");

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

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

    Ok(())
}

쿼리 매개변수에 대한 해시맵을 생성한 다음 쿼리 메서드에 전달합니다. header::HeaderMap 유형의 인스턴스를 생성하여 헤더를 추가합니다.

headers_for_requests 함수는 여러 헤더와 쿼리 매개변수를 사용하여 example.com 로 GET 요청을 보냅니다. 이 함수는 각각 헤더와 쿼리 매개변수가 포함된 맵을 가져오는 헤더 및 쿼리 메서드를 사용합니다.

WASM으로 Rust에서 풀스택 웹앱을 구축할 수 있다

HTTP 요청을 만드는 것은 다른 애플리케이션의 기능을 통합하는 정교한 애플리케이션을 구축하는 데 유용한 기술입니다.

뛰어난 개발 경험을 위해 복잡성을 추상화하는 Percy, Yew, Sycamore와 같은 라이브러리를 사용하여 Rust에서 풀스택 웹 애플리케이션을 빌드할 수 있습니다.

By 최은지

윈도우(Windows)와 웹 서비스에 대한 전문 지식을 갖춘 노련한 UX 디자이너인 최은지님은 효율적이고 매력적인 디지털 경험을 개발하는 데 탁월한 능력을 발휘합니다. 사용자의 입장에서 생각하며 누구나 쉽게 접근하고 즐길 수 있는 콘텐츠를 개발하는 데 주력하고 있습니다. 사용자 경험을 향상시키기 위해 연구를 거듭하는 은지님은 All Things N 팀의 핵심 구성원으로 활약하고 있습니다.