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

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

问题原因
  1. 二进制文件读取错误:read()函数默认按文本格式读取文件,DICOM是二进制文件,会导致内容损坏,后续构建multipart请求时出现格式异常。
  2. 语法错误:multipart file配置中contentType使用了等号=,不符合Karate的JSON语法规范,会导致参数解析失败。
  3. 手动设置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:30:48