Rust 요청 및 Aruba AOS-CX API

21998 단어

AOS-CX 녹 요청 클라이언트



이러한 코드 스니펫은 Rust 요청을 사용하는 Aruba AOS-CX API에 대한 API 호출의 예를 제공합니다.

1. 종속성



먼저 프로젝트에 종속성을 추가해야 합니다.
이렇게 하려면 cargo.toml 파일을 다음과 같이 업데이트하십시오.

[dependencies]
reqwest = { version = "0.11", features = ["json", "cookies"] }
tokio = { version = "1", features = ["full"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1.0"


2. 로그인/로그아웃



AOS-CX API와의 모든 상호 작용에는 로그인이 필요하며 원활한 관리를 위해 로그아웃이 필요합니다.
API는 인증을 위해 사용자 이름/비밀번호를 사용합니다.

이 스니펫으로 다음을 수행합니다.
  • 로그인 API 호출 보내기
  • 요청 상태 코드 확인
  • 로그인에 실패하면 화면에 오류를 인쇄합니다.
  • 로그아웃 호출 보내기
  • 로그아웃 호출 상태 코드를 확인하고 200이 아닌 경우 화면에 인쇄합니다.

  • #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let ip_add: &str = "your-ip-address";
        let full_url = format!("https://{}/rest/latest/", ip_add);
    
        let client = reqwest::Client::builder()
            .cookie_store(true)
            .danger_accept_invalid_certs(true)
            .build()?;
        let params = [("username", "your-username"), ("password", "your-password")];
    
        let resp = client
            .post(format!("{}login", full_url))
            .form(&params)
            .send()
            .await?;
        if resp.status() != 200 {
            println!("Login unsuccessful, code is {:#?}", resp.status());
        }
        let logout = client.post(format!("{}logout", full_url)).send().await?;
        if logout.status() != 200 {
            println!("Logout unsuccessful, code is {:#?}", logout.status());
        } else {
            println!("Logout successful");
        }
    
        Ok(())
    }
    
    

    3. 일부 데이터 가져오기



    로그인/로그아웃 프레임워크가 있으면 GET, POST, PUT 및 DELETE 데이터에 대한 API 호출을 삽입할 수 있습니다.
    다음은 장치의 펌웨어를 쿼리하기 위해 GET 호출을 보내는 예입니다.
    응답은 응답 키, 값 쌍을 처리하기 위해 미리 정의된 구조체를 사용하여 역직렬화할 수 있는 JSON입니다.
  • 먼저 구조체를 정의합니다. 이것은 'current_version' 키에 대한 것이며 값은 문자열 유형으로 지정됩니다.
  • 그런 다음 reqwests 클라이언트를 사용하여 GET의 URL과 반환된 JSON을 처리하는 방법을 정의합니다.
  • 응답에서 구조체의 이름이 json에 대해 참조됩니다.

  • use serde::Deserialize;
    
    #[derive(Deserialize)]
    struct Image {
        current_version: String,
    }
    
    let firmware = client
            .get(format!("{}firmware", full_url))
            .send()
            .await?
            .json::<Image>()
            .await?;
        println!("{:?}", firmware.current_version);
    

    4. JSON을 동적으로 구문 분석



    3단계에 제공된 예제는 반환된 JSON을 처리하는 좋은 방법을 제공하지만 구조체를 구성할 수 있으려면 API에서 반환되는 키, 값 쌍을 알아야 합니다.
    API를 조사할 때 필요한 데이터를 찾기 위해 시행착오를 겪는 경우가 많습니다.

    그렇다면 무엇이 반환될지 모른 채 데이터를 수신하기 위해 어떻게 GET 호출을 보낼 수 있습니까?

    이를 위해 JSON 응답을 해시 맵에 동적으로 공급할 수 있습니다.
  • 먼저 std::collections::HashMap;를 범위로 가져와야 합니다.
  • 그런 다음 두 번째 예와 동일한 GET 호출을 보냅니다.
  • 그러나 JSON 응답의 경우 구조체가 아닌 동적 해시 맵을 참조합니다.
  • 단점은 데이터를 직접 제공하기 위해 특정 키를 호출할 수 없다는 것입니다. 키, 값 쌍은 이제 단순한 문자열이지만 전체 응답을 출력할 수 있습니다.

  • use std::collections::HashMap;
    
         let firmware = client
             .get(format!("{}firmware", full_url))
             .send()
             .await?
             .json::<HashMap<String, String>>()
             .await?;
         println!("{:#?}", firmware);
    

    5. 구조체를 사용하여 모두 모으기



    다음은 구조체를 사용하는 전체 코드입니다. 추가 키를 추가했습니다.

    use serde::Deserialize;
    
    #[derive(Deserialize)]
    struct Image {
        current_version: String,
        booted_image: String,
    }
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let ip_add: &str = "your-ip-address";
        let full_url = format!("https://{}/rest/latest/", ip_add);
    
        let client = reqwest::Client::builder()
            .cookie_store(true)
            .danger_accept_invalid_certs(true)
            .build()?;
        let params = [("username", "your-username"), ("password", "your-password")];
    
        let resp = client
            .post(format!("{}login", full_url))
            .form(&params)
            .send()
            .await?;
        if resp.status() != 200 {
            println!("Login unsuccessful, code is {:#?}", resp.status());
        }
    
        let firmware = client
            .get(format!("{}firmware", full_url))
            .send()
            .await?
            .json::<Image>()
            .await?;
    
        println!(
            "Current firmware image: {}\nBoot firmware image: {}",
            firmware.current_version, firmware.booted_image
        );
        let logout = client.post(format!("{}logout", full_url)).send().await?;
        if logout.status() != 200 {
            println!("Logout unsuccessful, code is {:#?}", logout.status());
        } else {
            println!("Logout successful");
        }
    
        Ok(())
    }
    
    


    샘플 출력은 다음과 같습니다.

    ➜  test1 git:(master) ✗ cargo run
        Finished dev [unoptimized + debuginfo] target(s) in 0.09s
         Running `target/debug/test1`
    Current firmware image: FL.10.09.1020
    Boot firmware image: primary
    Logout successful
    


    6. 동적 해시 맵을 사용하여 모두 모으기




    use std::collections::HashMap;
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let ip_add: &str = "your-ip-address";
        let full_url = format!("https://{}/rest/latest/", ip_add);
    
        let client = reqwest::Client::builder()
            .cookie_store(true)
            .danger_accept_invalid_certs(true)
            .build()?;
        let params = [("username", "your-username"), ("password", "your-password")];
    
        let resp = client
            .post(format!("{}login", full_url))
            .form(&params)
            .send()
            .await?;
        if resp.status() != 200 {
            println!("Login unsuccessful, code is {:#?}", resp.status());
        }
         let firmware = client
             .get(format!("{}firmware", full_url))
             .send()
             .await?
             .json::<HashMap<String, String>>()
             .await?;
         println!("{:#?}", firmware);
    
        let logout = client.post(format!("{}logout", full_url)).send().await?;
        if logout.status() != 200 {
            println!("Logout unsuccessful, code is {:#?}", logout.status());
        } else {
            println!("Logout successful");
        }
    
        Ok(())
    }
    


    샘플 출력:

    ➜  test1 git:(master) ✗ cargo run
       Compiling test1 v0.1.0 (/Users/joeneville/code/test1)
        Finished dev [unoptimized + debuginfo] target(s) in 1.56s
         Running `target/debug/test1`
    {
        "current_version": "FL.10.09.1020",
        "primary_version": "FL.10.09.1020",
        "secondary_version": "FL.10.09.1010",
        "default_image": "primary",
        "booted_image": "primary",
    }
    Logout successful
    

    좋은 웹페이지 즐겨찾기