PHP中解析Curl请求返回的multipart/mixed类型响应
解析multipart/mixed类型的API响应(分离JSON与PDF内容)
绝对不要用正则表达式解析multipart响应——这种格式遵循严格的MIME规范,用现成的MIME解析库才是可靠且优雅的方案,完全能避免正则带来的边界错误和维护问题。以下是几种主流编程语言的实现示例:
Python 实现
利用Python标准库中的email模块(multipart格式与邮件MIME结构一致),可以轻松拆分响应内容:
import email import json from email import policy import requests # 发起API请求 response = requests.get("你的第三方API地址") # 解析multipart响应 msg = email.message_from_bytes(response.content, policy=policy.default) # 遍历每个部分,分离JSON和PDF for part in msg.walk(): # 跳过嵌套的multipart容器 if part.is_multipart(): continue content_type = part.get_content_type() if content_type == "application/json": # 提取并解析JSON json_content = part.get_content() json_data = json.loads(json_content) print("提取到的JSON数据:", json_data) elif content_type in ("application/octet-stream", "application/pdf"): # 提取PDF二进制内容 pdf_bytes = part.get_content() # 保存到本地文件 with open("label.pdf", "wb") as f: f.write(pdf_bytes) print("PDF文件已保存")
Java 实现
使用Apache HttpClient工具,自动解析multipart响应:
import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.entity.mime.MultipartEntity; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.core.type.TypeReference; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.charset.StandardCharsets; public class MultipartParser { public static void main(String[] args) throws Exception { try (CloseableHttpClient client = HttpClients.createDefault()) { HttpGet request = new HttpGet("你的第三方API地址"); HttpResponse response = client.execute(request); HttpEntity entity = response.getEntity(); if (entity instanceof MultipartEntity) { MultipartEntity multipartEntity = (MultipartEntity) entity; for (HttpEntity part : multipartEntity.getParts()) { String contentType = part.getContentType().getValue(); if (contentType.contains("application/json")) { // 解析JSON String jsonStr = org.apache.http.util.EntityUtils.toString(part, StandardCharsets.UTF_8); ObjectMapper mapper = new ObjectMapper(); java.util.Map<String, Object> jsonData = mapper.readValue(jsonStr, new TypeReference<>() {}); System.out.println("提取到的JSON数据: " + jsonData); } else if (contentType.contains("application/octet-stream") || contentType.contains("application/pdf")) { // 提取并保存PDF byte[] pdfBytes = org.apache.http.util.EntityUtils.toByteArray(part); Files.write(Paths.get("label.pdf"), pdfBytes); System.out.println("PDF文件已保存"); } } } } } }
核心原理
multipart/mixed响应的结构由分隔符(boundary)、各个部分的头部(Content-Type等)和正文组成,专业的MIME解析库会严格按照RFC 2046规范处理这些元素:
- 自动识别响应头中的
boundary参数(示例中的uuid:edec021d-b138-4eca-9897-003b7e33e246) - 正确拆分不同部分,避免正文内容中出现类似分隔符的字符串导致错误
- 自动处理编码、转义等细节
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

