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
相关产品推荐
相关产品推荐

