在rust中存储来自分页API的响应



我正在尝试使用下面的代码调用分页API。当我在没有next-token(即没有循环)的情况下调用它时,我可以计算余额的数量,即response.balance .len()。


#[derive(Deserialize, Debug, Clone)]
pub struct Algoholder {
balances: Vec<Balance>,
#[serde(rename = "current-round")]
current_round: i64,
#[serde(rename = "next-token")]
next_token: Option<String>,
}
async fn get_algorand_data() -> i64 {
let client = reqwest::Client::new();
let mut response;
let mut current =
"http://mainnet-idx.algonode.network/v2/assets/2751733/balances?currency-greater-than=0"
.to_string();
loop {
response = client
.get(&current)
.header("x-api-key", &env::var("ALGOD_TOKEN").unwrap())
.header(CONTENT_TYPE, "application/json")
.header(ACCEPT, "application/json")
.header("pragma", "public")
.send()
.await
.unwrap()
.json::<Algoholder>()
.await
.unwrap();
if let Some(next) = &response.next_token {
current = format!("{}&next={}", "http://mainnet-idx.algonode.network/v2/assets/2751733/balances?currency-greater-than=0", next);
println!(
"{}",
format!("{}&next={}", &env::var("ALGOD_URL_1").unwrap(), next)
)
} else {
println!("Balances in loop : {}", &response.balances.len());
break;
}
}
println!("Number of accounts {}", response.balances.len() as i64);
response.balances.len() as i64
}

然而,当我在循环中评估平衡时,我得到0。如能提供帮助,我将不胜感激。

http://mainnet-idx.algonode.network/v2/assets/2751733/balances?currency-greater-than=0&next=UQIOTCZOKI3VIDIF7IY72DIZUCGLRSMHY65NCQHJ3IG6ZJPWTCG7PXMAUQ
http://mainnet-idx.algonode.network/v2/assets/2751733/balances?currency-greater-than=0&next=777ILN5AAYHZ7RHSFZOAYVJHEJSRZRJCCXEAUMMHIY7AGR7ZMDTAU52BII
Balances in loop : 0
Number of accounts 0

我的代码的问题是我没有将循环的结果存储在任何地方。

我创建了一个对象的矢量,并把它们推进去。

下面是更新后的函数:

async fn get_algorand_data() -> i64 {
let client = reqwest::Client::new();
let mut response;
let mut current =
"http://mainnet-idx.algonode.network/v2/assets/2751733/balances?currency-greater-than=0"
.to_string();
let mut holders: Vec<Algoholder> = Vec::new(); // Initialise Vector here
loop {
response = client
.get(&current)
.header("x-api-key", &env::var("ALGOD_TOKEN").unwrap())
.header(CONTENT_TYPE, "application/json")
.header(ACCEPT, "application/json")
.header("pragma", "public")
.send()
.await
.unwrap()
.json::<Algoholder>()
.await
.unwrap();
holders.push(response.clone()); // push them here
if let Some(next) = &response.next_token {
current = format!("{}&next={}", "http://mainnet-idx.algonode.network/v2/assets/2751733/balances?currency-greater-than=0", next);
} else {
break;
}
}
let mut sum = 0;
for entry in &mut holders {
println!("The Entry is  {:?}", entry.balances.len());
sum += entry.balances.len();
}
sum as i64
}