Mirth v3.12.0获取Query String重复参数值的问题求助
解决Mirth v3.12.0中HTTP监听器重复参数的访问问题
我在Mirth v3.12.0中搭建了HTTP监听器通道,接收如下GET请求:http://localhost:38081/Observation?identifier=2230106554&issued=ge[2023-07-08 10:00:02.345678]&issued=le[2023-07-08 12:00:02.345678]
尝试在转换器中获取两个issued参数值时,使用以下代码报错:
var issued0; var issued1; var issued = sourceMap.get('parameters').get('issued'); issued0 = issued[0]; issued1 = issued[1];
错误信息显示:
478: issued0 = issued[0]; 479: issued1 = issued[1]; 480: var ge; 481: var le; 482: var headIssued0 = issued0.substring(0,2); 483: var headIssued1 = issued1.substring(0,2); LINE NUMBER: 479 DETAILS: Java class "java.lang.String" has no public instance field or method named "0".
问题原因
Mirth的sourceMap.get('parameters')返回的是Java Map<String, Object>对象,当请求包含多个同名参数时,默认会将多个参数值拼接为逗号分隔的字符串,而非JavaScript数组。此时你尝试用issued[0]访问,本质是试图调用Java String对象的0属性,自然会报错。
解决方案
以下两种方法可以正确获取重复参数的数组值:
方法1:分割拼接字符串
如果参数值已被拼接为逗号分隔的字符串,直接分割成数组:
// 获取参数Map var params = sourceMap.get('parameters'); // 获取拼接后的issued字符串 var issuedStr = params.get('issued'); // 分割为数组 var issuedArray = issuedStr.split(','); // 提取两个参数值 var issued0 = issuedArray[0]; var issued1 = issuedArray[1]; // 后续处理逻辑 var headIssued0 = issued0.substring(0,2); var headIssued1 = issued1.substring(0,2);
方法2:直接从请求对象获取参数数组(更可靠)
通过sourceMap中的request对象(原始HTTP请求对象),调用getParameterValues方法直接获取参数的数组形式,这是处理重复参数的标准方式:
// 获取原始HTTP请求对象 var request = sourceMap.get('request'); // 获取所有issued参数值的数组 var issuedArray = request.getParameterValues('issued'); // 先检查数组是否存在且长度足够 if (issuedArray && issuedArray.length >= 2) { var issued0 = issuedArray[0]; var issued1 = issuedArray[1]; var headIssued0 = issued0.substring(0,2); var headIssued1 = issued1.substring(0,2); } else { // 处理参数缺失的异常情况 logger.error("请求中缺少足够的issued参数"); }
注意事项
- 务必添加空值和长度检查,避免出现数组越界或空指针错误;
- Mirth使用Rhino JavaScript引擎,处理Java对象时要注意其与原生JS对象的差异,比如
getParameterValues返回的是Java数组,可以直接按下标访问。
内容的提问来源于stack exchange,提问作者Patrick Palmerini
相关产品推荐
相关产品推荐

