必须用soap规范包裹xml响应:以soap:envelope开头并声明命名空间,响应体置于soap:body内,根元素名及命名空间前缀须与wsdl中wsdl:output定义严格一致,否则mock service报500且提示“no matching operation”。

Mock Service里怎么写XML响应体才不被SoapUI报错
直接贴XML进“Response”文本框大概率失败——SoapUI默认会校验XML结构合法性,且要求根节点与WSDL中定义的soap:Body内响应元素严格匹配。常见错误是粘贴裸XML(比如只写<getuserresponse><id>123</id></getuserresponse>),缺命名空间或没包在soap:Envelope里。
- 必须按SOAP 1.1或1.2规范包裹:开头加
<envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"></envelope>,结尾闭合 - 响应体要嵌在
<body></body>内,且根元素名、命名空间前缀需和WSDL中<operation></operation>对应的<output></output>一致(比如tns:getUserResponse) - 如果WSDL里定义了targetNamespace,XML里必须声明对应前缀,例如
xmlns:tns="http://example.com/user",否则Mock Service返回500且日志里提示“no matching operation”
用Script断言动态生成XML响应时要注意什么
想根据请求参数返回不同数据?别直接拼字符串。SoapUI的Groovy脚本支持XmlSlurper和StreamingMarkupBuilder,但手写out " + request.id + ""容易出XML转义问题(如&变&)或格式错乱。
- 优先用
XmlSlurper解析原始请求XML,再用StreamingMarkupBuilder构造响应,能自动处理命名空间和转义 - 脚本里取请求参数别用
context.expand('${Request#Request}')硬解析,改用def req = new XmlSlurper().parseText(mockRequest.requestContent) - Mock Service的脚本执行上下文里没有
log对象,调试时用mockRunner.log.info("xxx"),否则控制台看不到输出
为什么Mock Service返回的XML里中文是乱码
不是编码设置问题,而是SoapUI Mock Service默认用ISO-8859-1输出HTTP响应头,即使XML声明了<?xml version="1.0" encoding="UTF-8"?>,浏览器或调用方仍可能按ISO解码。
- 必须在Mock Service的“OnRequest Script”里手动设置响应头:
mockResponse.httpResponse.setContentType("text/xml;charset=UTF-8") - 同时确保XML响应体第一行明确声明编码:
<?xml version="1.0" encoding="UTF-8"?>,两者缺一不可 - 如果用的是SoapUI Pro旧版本(低于5.7),这个
setContentType方法可能不存在,得降级用mockResponse.setResponseHeader("Content-Type", "text/xml;charset=UTF-8")
WSDL里有复杂类型(如xs:sequence嵌套)时怎么模拟
别手动一层层写嵌套标签。SoapUI对XSD复杂类型的校验很松,但调用方(尤其是.NET客户端)会严格校验 minOccurs/maxOccurs 和顺序。直接删掉可选字段或打乱<element></element>顺序,会导致“Validation error: element not allowed here”。
- 打开WSDL,在
<complextype name="User"></complextype>下看<sequence></sequence>里的字段顺序和minOccurs值,XML响应里必须严格按此顺序出现,可选字段(minOccurs="0")可以省略,但不能插在必填字段中间 - 数组类型(
maxOccurs="unbounded")要用重复的同名标签,比如<roles><role>admin</role><role>user</role></roles>,不能写成<roles>admin,user</roles> - 如果WSDL里用了
xs:choice,Mock响应里只能出现其中**一个**分支的元素,多写或少写都会触发校验失败
命名空间、顺序、编码、可选字段——这四个点漏掉任何一个,Mock出来的接口在真实集成环境里就可能突然罢工。尤其当别人用你配的Mock做自动化测试时,问题往往卡在最不显眼的地方。










