녹이 있는 REST

11487 단어 apifetchbeginnersrust
이것은 원래 게시되었습니다here.

Rust로 REST API를 호출하는 것은 프로그래밍 언어로서 Rust의 가파르고 긴 학습 곡선 때문에 처음에는 어려운 작업처럼 보일 수 있습니다.

우리는 REST API와 접촉하는 것이 머리에 떠오르는 거의 모든 다른 앱을 만드는 것과 관련이 있다는 것을 알고 있습니다.
reqwest 라이브러리를 사용하여 본질적으로 기본 HTTP 클라이언트의 상위 수준 구현인 요청을 만듭니다.

# Cargo.toml
reqwest = { version = "0.11", features = ["json"] }
tokio = { version = "1", features = ["full"] }
dotenv = "0.15.0" # optional
serde = {version = "1.0.144", features = ["derive"]}


이 작업을 수행하기 위해 다음 라이브러리를 가져옵니다.


도서관
목적


요청하다
우리의 요청을 하기 위해

토키오
비동기 요청 및 기타 비동기 작업을 수행합니다.

세르데
json 응답을 녹 구조로 역직렬화하기 위해


기본 GET 요청하기




#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let resp = reqwest::get("<url>").await?;
    let resp_json = resp.json::<HashMap<String, String>>().await?;

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

    Ok(());
}


여기서 우리는 다음과 같은 주요 작업을 수행합니다.
  • 함수 내에서 await를 사용하기 위해 기본 함수에 tokio::main 특성을 추가합니다.
  • 기본 함수의 반환 유형을 단위 유형 - ()에서 Result<(), Box<dyn std::error::Error>>로 변경하여 요청에서 오류가 있는 경우 오류를 포착합니다.
  • 그런 다음 get 함수를 사용하여 요청하고 대기하고 turbofish 연산자를 사용하여 future의 반환 유형만 가져옵니다.
  • 이 연산자를 사용하는 이유에 대한 추가 정보, here .

  • 그런 다음 편의를 위해 JSON 응답을 HashMap<String, String>로 역직렬화하고 대기합니다.

  • 요청에 헤더 추가



    요청에 헤더를 추가하려면 먼저 요청 클라이언트를 만들고 이를 사용하여 애플리케이션에 헤더를 추가합니다.

    use reqwest::header::HeaderMap;
    
    #[tokio::main]
    async fn main() {
        ...
        let client = reqwest::Client::new();
        let mut headers = HeaderMap::new();
        headers.insert("content-type", "application/json".parse().unwrap());
    



    use reqwest::header::HeaderMap;
    
    #[tokio::main]
    async fn main() {
        ...
        let client = reqwest::Client::new();
        let mut headers = HeaderMap::new();
        headers.insert("content-type", "application/json".parse().unwrap());
        headers.insert("Authorization", format!("Bearer {}", API_TOKEN).parse().unwrap());
    
        let resp = client.get("<url>")
                                    .headers(headers)
                                    .send()
                                    .await?;
    
        ...
    }
    


    위에서 수행한 작업은 다음과 같습니다.
  • 요청을 보내기 위해 요청 클라이언트를 생성합니다.
  • HeaderMap와 유사한 HashMap 인스턴스의 가변 인스턴스를 생성합니다.
  • 헤더에 키-값 쌍으로 헤더를 삽입합니다.
  • .parse().unwrap()&str를 사용하여 문자열 유형을 헤더 값 유형으로 변환합니다.

  • 그런 다음 .headers() 메서드를 사용하여 클라이언트 요청에 헤더를 추가합니다.
  • 또한 get 메서드를 직접 사용하는 것과 다른 점은 요청을 기다리기 전에 요청에 대해 send 메서드를 호출해야 한다는 점입니다.

  • JSON 본문으로 게시물 요청 보내기



    요청 클라이언트에서 또는 라이브러리에서 직접 post 메서드를 사용하여 게시물 요청을 보내고 json 메서드를 사용하여 게시물 요청에 본문을 추가합니다.

    여기 본체는 그냥 녹슨HashMap입니다.

    ...
    let mut body = HashMap::new();
    body.insert("username", "myusername");
    let resp = client.post("<url>")
        .json(&body)
        .send()
        .await?;
    ...
    


    JSON 응답 역직렬화



    전송된 요청에 json 메서드를 사용하여 API에서 JSON 응답을 역직렬화하고 해당 유형으로 일반적으로 호출하여 선호하는 형태 또는 유형으로 가져올 수 있습니다.

    한 가지 유의할 점은 형식이 Deserialize 특성을 구현해야 한다는 것입니다.

    먼저 JSON 응답을 원하는 유형을 만들고 역직렬화 특성을 구현합니다. 특성을 직접 구현하는 것은 지루하고 신뢰할 수 없으므로 이전에 가져온 serde 라이브러리를 사용합니다.

    use serde::Deserialize;
    
    // deriving the Debug trait also to be able to print it
    #[derive(Debug, Deserialize)]
    struct APIResponse {
        message: String;
        error: String;
    }
    


    그런 다음 위의 구조체를 사용하여 응답을 다음과 같이 역직렬화할 수 있습니다.

    ...
    let resp_json = resp.json::<APIResponse>().await?;
    ...
    


    참조


  • reqwest library documentation ,

  • Rust ASYNC documentation ,

  • YouTube Tutorial by Tom .
  • 좋은 웹페이지 즐겨찾기