Karate测试multipart/related类型DICOM STOW API遇问题求助
问题描述
使用Karate编写Feature文件测试multipart/related类型的DICOM STOW API时执行失败,报错:net.minidev.json.parser.ParseException: Unexpected End Of File position 79: null。对应的CURL命令可正常运行。
有效CURL命令
curl -X POST -i https://abcd.com/studies -H "Content-Type: multipart/related" -H "Authorization: Bearer xxxx" -F "content=@test.dcm; type=application/dicom"
现有Karate场景代码
Background: * def filePath = read('../../../resources/TestData/test.dcm') Scenario: Multipart DICOM upload test And header Content-Type = 'multipart/related' And header Authorization = 'Bearer '+ xxxx And header API-version = 1 And multipart file content = {value: '#(filePath)', filename: 'test.dcm', contentType= 'application/dicom'} When method post Then status 200
问题原因
- 二进制文件读取错误:
read()函数默认按文本格式读取文件,DICOM是二进制文件,会导致内容损坏,后续构建multipart请求时出现格式异常。 - 语法错误:
multipart file配置中contentType使用了等号=,不符合Karate的JSON语法规范,会导致参数解析失败。 - 手动设置Content-Type冲突:手动指定
multipart/related会覆盖Karate自动生成的包含边界参数的完整请求头,破坏multipart请求的格式结构。
解决方案
修改Karate代码,正确读取二进制文件并修正语法问题:
Background: * def fileBytes = readAsBytes('../../../resources/TestData/test.dcm') Scenario: Multipart DICOM upload test And header Authorization = 'Bearer '+ xxxx And header API-version = 1 And multipart file content = {value: '#(fileBytes)', filename: 'test.dcm', contentType: 'application/dicom'} When method post Then status 200
关键修改说明
- 使用
readAsBytes()替代read():保留DICOM文件的原始二进制数据,避免文本解析导致的内容损坏。 - 移除手动设置的
Content-Type:Karate会自动生成包含边界参数的multipart/related请求头,确保请求格式符合标准。 - 修正
contentType赋值符号:将=改为:,符合JSON语法要求,保证参数正确解析。
可选验证步骤
若需要确认请求格式是否与CURL一致,可开启Karate的请求日志打印:
* configure logRequestResponse = true
内容的提问来源于stack exchange,提问作者Suneel
相关产品推荐
相关产品推荐

