You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust Rocket服务中使用reqwest读取IPFS接口JSON响应的方法

基于Rocket + reqwest 解析IPFS swarm/peers接口JSON响应实现方案

第一步:添加依赖

首先在Cargo.toml中添加JSON解析和请求相关依赖:

[dependencies]
rocket = { version = "0.5", features = ["json"] }
reqwest = { version = "0.11", features = ["json"] } # 用同步请求可额外加blocking特性
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

第二步:定义IPFS响应对应结构体(动态解析可跳过)

根据IPFS接口返回的标准JSON结构,定义可反序列化的结构体,注意IPFS返回字段首字母为大写,需要用serde属性做映射:

use serde::Deserialize;

#[derive(Debug, Deserialize)]
pub struct IpfsSwarmPeersResponse {
    #[serde(rename = "Peers")]
    pub peers: Vec<IpfsPeerInfo>,
}

#[derive(Debug, Deserialize)]
pub struct IpfsPeerInfo {
    #[serde(rename = "Addr")]
    pub addr: String,
    #[serde(rename = "Peer")]
    pub peer_id: String,
    #[serde(rename = "Latency")]
    pub latency: Option<String>,
    #[serde(rename = "Muxer")]
    pub muxer: Option<String>,
    #[serde(rename = "Direction")]
    pub direction: Option<String>,
}

第三步:请求+解析代码实现

异步实现(适配Rocket 0.5默认异步环境)

use reqwest::Client;
use rocket::http::Status;
use rocket::serde::json::Json;

#[get("/ipfs-peers")]
pub async fn get_ipfs_peers() -> Result<Json<IpfsSwarmPeersResponse>, Status> {
    const IPFS_API_URL: &str = "http://127.0.0.1:5001/api/v0/swarm/peers";
    let client = Client::new();

    // 发起POST请求
    let resp = client.post(IPFS_API_URL)
        .send()
        .await
        .map_err(|_| Status::BadGateway)?;

    // 核心解析步骤:直接调用reqwest自带的json方法反序列化
    let peer_data = resp.json::<IpfsSwarmPeersResponse>()
        .await
        .map_err(|_| Status::InternalServerError)?;

    // 后续可直接操作结构体字段,示例遍历打印节点信息
    for peer in &peer_data.peers {
        println!("节点ID:{},访问地址:{}", peer.peer_id, peer.addr);
    }

    Ok(Json(peer_data))
}

动态解析实现(无需预定义结构体)

如果不需要强类型校验,可直接解析为serde_json::Value动态操作:

#[get("/ipfs-peers-dynamic")]
pub async fn get_ipfs_peers_dynamic() -> Result<Json<serde_json::Value>, Status> {
    const IPFS_API_URL: &str = "http://127.0.0.1:5001/api/v0/swarm/peers";
    let resp = reqwest::Client::new()
        .post(IPFS_API_URL)
        .send()
        .await
        .map_err(|_| Status::BadGateway)?;

    let json_data: serde_json::Value = resp.json()
        .await
        .map_err(|_| Status::InternalServerError)?;

    // 动态访问字段示例
    if let Some(peers) = json_data["Peers"].as_array() {
        for peer in peers {
            println!("节点ID:{}", peer["Peer"].as_str().unwrap_or_default());
        }
    }

    Ok(Json(json_data))
}

注意事项

  • 若使用同步版本reqwest,去掉所有async/await关键字,.json()方法可直接返回解析结果
  • 解析失败优先检查结构体字段映射是否和IPFS返回的JSON字段完全匹配,IPFS官方接口返回字段默认首字母大写
  • 需确保IPFS节点的5001 API端口已对你的Rocket服务所在IP开放访问权限

内容的提问来源于stack exchange,提问作者Kalanamith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:24:02