如何用Rust的reqwest解析multipart/form-data响应并保存PDF
处理reqwest返回的multipart/form-data响应并提取PDF文件
reqwest仅提供multipart请求构建能力,解析响应需借助第三方库,推荐使用multipart-parser,以下是完整实现流程:
1. 添加依赖
在Cargo.toml中引入所需依赖:
[dependencies] reqwest = { version = "0.11", features = ["blocking", "headers"] } multipart-parser = "0.10"
2. 完整代码实现
use reqwest::{blocking::Client, header::{AUTHORIZATION, CONTENT_TYPE}}; use multipart_parser::parse_multipart; use std::fs::File; use std::io::Write; fn main() { let access_token = "your_access_token"; // 替换为实际的访问令牌 let url = "https://example.com/rest/document/123"; let client = Client::new(); let res = client.get(url) .header(AUTHORIZATION, format!("Bearer {}", access_token)) .send() .expect("请求API失败"); // 从Content-Type头提取multipart分隔符(boundary) let content_type = res.headers() .get(CONTENT_TYPE) .expect("响应缺少Content-Type头") .to_str() .expect("Content-Type格式无效"); let boundary = content_type.split("boundary=") .nth(1) .expect("无法从Content-Type中提取boundary"); // 读取响应的二进制内容 let body = res.bytes().expect("读取响应体失败"); // 遍历multipart部件,找到目标PDF并保存到磁盘 let mut parts = parse_multipart(&body, boundary.as_bytes()) .expect("解析multipart响应失败"); while let Some(part) = parts.next() { let part = part.expect("解析部件失败"); if let Some(disposition) = part.content_disposition { if disposition.name == Some("document".to_string()) { let mut file = File::create("document.pdf").expect("创建文件失败"); file.write_all(&part.data).expect("写入文件失败"); println!("PDF文件已成功保存"); break; } } } }
关键说明
- boundary提取:必须从响应的
Content-Type头中动态获取分隔符,不能硬编码示例值,因为每次请求的boundary可能不同。 - 部件定位:通过
Content-Disposition的name字段匹配到名为document的部件,该部件包含PDF的二进制数据。 - 错误处理:示例用
expect简化代码,生产环境建议改用match或?(需将main函数返回类型改为Result<(), Box<dyn std::error::Error>>)来优雅处理各类异常。 - 大文件优化:如果PDF文件体积较大,建议使用
multipart-parser的流式解析API,避免一次性加载整个响应体到内存。
内容的提问来源于stack exchange,提问作者pfust75
相关产品推荐
相关产品推荐

