
# Rust {/* #rust */}

首先阅读 [REST 指南](/docs/zh/api/rest)，获取平台 API 令牌。本示例使用 [reqwest 的阻塞客户端](https://docs.rs/reqwest/latest/reqwest/blocking/)和 Serde。

运行 `cargo new reconstruct-rest-client` 创建项目。在 `Cargo.toml` 中添加以下依赖项：

```toml
[dependencies]
reqwest = { version = "0.13", features = ["blocking", "json"] }
serde = { version = "1", features = ["derive"] }
urlencoding = "2"
```

使用以下 `src/main.rs`：

```rust
use reqwest::blocking::Client;
use serde::Deserialize;
use std::env;

#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
struct Catalog { catalog_id: String }

#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
struct Page {
    #[serde(default)]
    catalogs: Vec<Catalog>,
    next_page_token: Option<String>,
}

#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
struct Detail { catalog_id: String, description: String }

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let token = env::var("CR_RECONSTRUCT_API_TOKEN")?;
    let base = "https://reconstruct.dev/api/v1/platform";
    let client = Client::new();

    let page: Page = client.get(format!("{base}/catalogs?pageSize=10"))
        .bearer_auth(&token).send()?.error_for_status()?.json()?;
    for catalog in page.catalogs {
        let url = format!("{base}/catalogs/{}", urlencoding::encode(&catalog.catalog_id));
        let detail: Detail = client.get(url)
            .bearer_auth(&token).send()?.error_for_status()?.json()?;
        println!("{}: {}", detail.catalog_id, detail.description);
    }
    if let Some(next) = page.next_page_token {
        println!("Next page token: {next}");
    }
    Ok(())
}
```

运行 `cargo run`。将 `nextPageToken` 作为 URL 编码的 `pageToken` 查询参数传入，以获取下一页。
