如何在 Rocket 中返回从外部 API 查询的对象数组

问题描述

我是 Rust 的新手,想用一些简单的东西来测试一下。该代码基本上查询外部 API 并返回响应。在这种情况下,响应是一个对象数组。

#![feature(proc_macro_hygiene,decl_macro)]

#[macro_use] extern crate rocket;
extern crate serde;
extern crate serde_json;

#[derive(Deserialize,Debug)]
struct InboundAddress {
    chain: String,pub_key: String,address: String,halted: bool,gas_rate: String,}

#[get("/addresses")]
fn addresses() -> Result<Vec<InboundAddress>,reqwest::Error> {
    let url = "https://midgard.thorchain.info/v2/thorchain/inbound_addresses";
    let addresses: Vec<InboundAddress> = reqwest::blocking::get(url)?.json()?;
    println!("First address chain is: {}",addresses[0].chain);
    Ok(addresses)
}


fn main() {
    rocket::ignite().mount("/",routes![addresses]).launch();
}

错误来自我试图返回的内容Result<Vec<InboundAddress>,reqwest::Error>,说“特征 rocket::response::Responder<'_> 没有为 std::result::Result<std::vec::Vec<InboundAddress>,reqwest::Error> 实现”

json 解析正确,从一些地址工作中注销详细信息。如何返回从 Rocket 中的外部 API 查询的对象数组?

解决方法

关键是用 Json 包装 Vec。

#[get("/addresses")]
fn addresses() -> Result<Json<Vec<InboundAddress>>,reqwest::Error> {
    let url = "https://testnet.midgard.thorchain.info/v2/thorchain/inbound_addresses";
    let addresses: Vec<InboundAddress> = reqwest::blocking::get(url)?.json()?;
    Ok(Json(addresses))
}