You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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文件,之前的尝试存在两个核心问题:

  1. 手动设置Content-Type: multipart/form-data,Karate会自动生成带边界的正确请求头,手动设置会破坏格式
  2. 错误将文件的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:05:09