SoapUI 5.7.0 POST请求requestContent后续调用返回空问题
SoapUI 5.7.0 Mock读取POST请求体重复返回空的解决方案
这个问题是SoapUI 5.7.0版本REST Mock模块的已知缺陷,核心原因是Mock引擎首次读取请求输入流做路由匹配时,会一次性把底层ServletInputStream的内容读完,且没有将读取结果做全局缓存,后续再调用mockRequest.requestContent时,流指针已经到末尾,自然只能读到空字符串,和你把代码写在OnRequestScript还是Dispatch Script里没有关系。
可直接落地的解决方法
按优先级选以下任意一种即可:
- 方法1:手动缓存请求体(无需升级版本,兼容性最好)
不要直接重复调用mockRequest.requestContent属性,第一次读取时就把内容存在请求上下文里,后续同一次请求的所有脚本都直接从缓存取值,参考Groovy脚本如下:
// 优先从请求上下文取已缓存的请求体 def requestBody = mockRequest.httpRequest.getAttribute("cachedReqBody") if (requestBody == null) { // 流未被读取时,手动读取流内容并转成字符串 requestBody = mockRequest.httpRequest.inputStream.getText("UTF-8") // 写入请求上下文缓存,供后续脚本使用 mockRequest.httpRequest.setAttribute("cachedReqBody", requestBody) } // 后续业务逻辑直接使用requestBody变量即可,无需再调用requestContent属性 log.info "接收到的POST请求体:{}", requestBody
- 方法2:开启内置缓存开关(零代码)
SoapUI本身预留了请求体缓存配置,只是5.7.0版本默认关闭:- 双击打开目标Mock服务的配置面板
- 切换到Properties标签页
- 新增自定义属性,名称填
mockService.alwaysCacheRequestContent,值设为true - 保存配置后重启Mock服务,之后直接调用
mockRequest.requestContent就不会出现空值问题
- 方法3:升级版本修复
这个流未缓存的bug在SoapUI 5.7.1及后续官方维护版本中已经被正式修复,升级后无需任何额外配置,直接读取mockRequest.requestContent属性即可在同一次请求的任意脚本位置重复拿到正确的请求体内容。
排查避坑提示
如果配置完以上方案还是出现空值,检查你的Mock服务是否挂载了自定义的请求拦截器/Filter:如果自定义逻辑里提前读取了请求输入流且没有做请求包装重放,同样会耗光流内容,这种场景直接用方法1的手动缓存逻辑即可绕开,不要依赖框架自带的requestContent属性。
内容的提问来源于stack exchange,提问作者kopfarzt
相关产品推荐
相关产品推荐

