Cypress发送multipart POST请求传PDF时FormData为空如何解决
问题原因及修复方案
遗漏的核心配置&错误点
- 配置缺失1:未关闭
cy.request默认的请求体序列化规则
Cypress 9.x版本的
cy.request默认会自动序列化非字符串类型的请求体,同时会自动覆盖Content-Type请求头。如果直接传入FormData对象,默认序列化逻辑会将其转换为空对象,就是你看到的Body: {}的根本原因。
修复需要在cy.request的参数中新增两个配置:
processData: false:关闭默认的请求体序列化逻辑,保留FormData原始格式contentType: false:禁止Cypress自动设置Content-Type头,让浏览器自动为FormData请求添加带boundary分隔符的正确头,手动设置multipart/form-data会缺少boundary导致后端无法解析参数
- 配置缺失2:fixture读取的二进制文件未转换为Blob格式
你用
binary格式读取的fixture返回的是二进制字符串,直接放到FormData的file字段无法被后端的MultipartFile正确识别,需要先转换为Blob对象,同时建议传入PDF文件名避免后端文件校验失败。
- 错误配置:请求头字段无效
你写的
accepts是不符合HTTP规范的头字段,标准头为Accept,这个头对multipart请求不是必填项,可以直接删除。
另外你调试时认为FormData为空是调试方式的问题,浏览器默认不会直接展示FormData的内部字段,可以用console.log([...data.entries()])打印所有键值对确认赋值成功。
修正后的完整代码
it('test', () => { cy.fixture(pdfFilePath, "binary").then(fileContent => { // 转换二进制字符串为PDF格式的Blob const pdfBlob = Cypress.Blob.binaryStringToBlob(fileContent, 'application/pdf'); const data = new FormData(); // 第三个参数传PDF文件名,避免后端MultipartFile识别异常 data.append('file', pdfBlob, 'test.pdf'); data.append('document-types', 'New Type'); cy.request({ method: "POST", url: '/api/v4/documents', headers: { authorization: authString }, body: data, // 新增两个核心配置 processData: false, contentType: false }).then((response) => { expect(response.status).to.eq(200) }); }); });
内容的提问来源于stack exchange,提问作者JeyKey
相关产品推荐
相关产品推荐

