如何在WireMock.NET (C#)中从Form-Data请求体提取PDF文件
WireMock.NET 从Form-Data提取PDF文件实现方案
核心实现思路
WireMock.NET处理Form-Data请求时,可通过RequestMessage的MultipartFormData属性直接获取上传的文件内容,无需依赖响应模板(响应模板更适合静态或简单动态响应,处理文件提取用自定义回调逻辑更直接)。
代码示例
1. 基础提取逻辑(匹配并返回上传的PDF)
using WireMock.Server; using WireMock.RequestBuilders; using WireMock.ResponseBuilders; using WireMock.Matchers; using WireMock.Models; var server = WireMockServer.Start(); server.Given(Request.Create() .WithPath("/upload-pdf") .UsingPost() .WithHeader("Content-Type", ContainsMatcher.Contain("multipart/form-data"))) .RespondWith(Response.Create() .WithCallback((requestMessage) => { // 从Form-Data中提取PDF文件(替换为实际表单字段名,示例为"pdfFile") var pdfFile = requestMessage.MultipartFormData.FirstOrDefault(f => f.Name == "pdfFile"); if (pdfFile != null && pdfFile.IsFile) { // 获取PDF字节内容,此处可替换为你的业务逻辑(保存、转发等) byte[] pdfBytes = pdfFile.BodyData.Body; // 示例:直接返回提取到的PDF作为响应 return Response.Create() .WithStatusCode(200) .WithHeader("Content-Type", "application/pdf") .WithBody(pdfBytes) .Build(); } // 未找到PDF文件时的响应 return Response.Create() .WithStatusCode(400) .WithBody("未找到上传的PDF文件") .Build(); }));
2. 扩展:验证文件类型并处理
如果需要确保上传的是PDF文件,可通过Content-Type或文件名后缀判断:
var pdfFile = requestMessage.MultipartFormData.FirstOrDefault(f => f.Name == "pdfFile" && f.IsFile && (f.ContentType == "application/pdf" || f.FileName.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase)));
关键说明
MultipartFormData:WireMock.NET自动解析Form-Data请求,将每个表单项封装为HttpContent对象,IsFile标记是否为文件字段。BodyData.Body:获取文件的原始字节数组,可直接用于后续处理(如写入本地文件、传递给其他服务等)。- 表单字段名:需与前端/客户端上传时使用的字段名完全一致,根据实际场景修改示例中的"pdfFile"。
内容的提问来源于stack exchange,提问作者eetawil
相关产品推荐
相关产品推荐

