Karate框架如何在同一请求内同时传递表单文本数据与上传文件
解决方案
问题根因
你当前遇到的问题是Karate框架默认会为multipart field声明的普通表单字段自动添加空的filename属性,绝大多数后端服务在解析multipart/form-data请求时,会将所有携带filename属性的请求part识别为文件类型,不会归入普通表单字段的取值范围,因此服务端无法正常获取destination字段的值。
修复方法
两种常用可行方案如下:
方案1:显式指定filename为空
在声明multipart field时,通过对象写法明确设置filename为null,避免生成多余的空filename属性:
Given path 'files' * multipart file fileUpl = { read: 'img1.jpeg', filename: 'img1.jpeg' } * multipart field destination = { value: "posts", contentType: "text/plain", filename: null } When method post Then status 200
方案2:使用field关键字(适用于Karate 1.0+版本)
更高版本的Karate提供了更简洁的field关键字,专门用于声明multipart请求下的普通表单字段,会自动过滤不需要的属性:
Given path 'files' * multipart file fileUpl = { read: 'img1.jpeg', filename: 'img1.jpeg' } * field destination = "posts" When method post Then status 200
注意事项
不要手动添加Content-Type: multipart/form-data请求头,Karate会自动生成带正确边界值的请求头,手动指定反而会导致后端无法正常解析表单内容。
修改后重新发起请求,destination对应的请求part将不会携带filename=""属性,服务端即可正常识别并获取字段值。
内容的提问来源于stack exchange,提问作者Deepanshu Mittal
相关产品推荐
相关产品推荐

