Rust 요청 및 Aruba AOS-CX API
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는 인증을 위해 사용자 이름/비밀번호를 사용합니다.
이 스니펫으로 다음을 수행합니다.
[dependencies]
reqwest = { version = "0.11", features = ["json", "cookies"] }
tokio = { version = "1", features = ["full"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1.0"
#[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(¶ms)
.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입니다.
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;
를 범위로 가져와야 합니다. 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(¶ms)
.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(¶ms)
.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
Reference
이 문제에 관하여(Rust 요청 및 Aruba AOS-CX API), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/joeneville_/rust-reqwests-and-aruba-aos-cx-api-2435텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)