在Karate中通过POST请求发送JSON文件遇阻,求技术解决方案
Karate中POST上传JSON文件更新列表失败问题
在Karate中尝试通过POST请求使用JSON文件更新列表时遇到问题,先后尝试将文件定义为表单字段和multipart文件,均无法复现Postman导出的CURL命令的正常效果(CURL中的敏感变量已移除,原命令可正常运行)。
参考CURL命令
curl --location 'https://{{QA_URL}}/v1/lists/10790' \ --header 'accept: application/json' \ --header 'x-key: {{KEY}}' \ --header 'x-secret: {{SECRET}}' \ --form 'file=@"/Downloads/tmp-test4.json"'
当前Karate场景代码
Scenario: GET list public api tests * def requestBody = read("file:src/test/java/json/User/Request/updateListDetails.json") * set requestBody.notes = randomString Given path '/v1' + '/lists/' And header Content-Type = 'application/json' And header x-key = Key And header x-secret = Secret When method GET * def listId = response.lists[2].id Given path '/v1' + '/lists/' + listId And header accept = 'application/json' And header Content-Type = 'multipart/form-data' And header x-key = Key And header x-secret = Secret #And form field file = read("file:src/test/java/json/User/Request/updateListDetails.json") #And multipart field file = { read: 'file:src/test/java/json/User/Request/updateListDetails.json', filename: 'updateListDetails.json', contentType: 'multipart/form-data' } #And request requestBody When method POST Then status 200
解决方案
问题分析
原CURL命令是通过multipart/form-data格式上传名为file的JSON文件,之前的尝试存在两个核心问题:
- 手动设置
Content-Type: multipart/form-data,Karate会自动生成带边界的正确请求头,手动设置会破坏格式 - 错误将文件的
contentType设为multipart/form-data,实际JSON文件对应的类型是application/json
修改后的Karate代码
Scenario: Update list via POST with JSON file * def requestBody = read("file:src/test/java/json/User/Request/updateListDetails.json") * set requestBody.notes = randomString // 把修改后的内容写入临时文件(如果需要动态调整原JSON内容) * write requestBody, 'src/test/java/json/User/Request/tmp-updated-list.json' Given path '/v1' + '/lists/' And header Content-Type = 'application/json' And header x-key = Key And header x-secret = Secret When method GET * def listId = response.lists[2].id Given path '/v1' + '/lists/' + listId And header accept = 'application/json' And header x-key = Key And header x-secret = Secret // 正确配置multipart文件字段 And multipart field file = { read: 'src/test/java/json/User/Request/tmp-updated-list.json', filename: 'updateListDetails.json', contentType: 'application/json' } When method POST Then status 200
补充说明
- 如果不需要动态修改JSON内容,直接读取原文件即可,跳过临时文件生成步骤
- Karate的
multipart field会自动处理multipart/form-data的请求头,无需手动设置 - 确保文件路径正确,相对路径以项目根目录为基准
内容的提问来源于stack exchange,提问作者DEnumber50
相关产品推荐
相关产品推荐

