WireMock独立版:从SOAP请求XML取值返回对应Mock响应
WireMock SOAP Stub 根据addressId匹配响应的实现方案及问题排查
核心错误原因
你之前用JSONPath表达式{{$.addressType.addressId}}无法提取addressId,是因为JSONPath仅用于解析JSON格式数据,而SOAP请求是XML格式,两者完全不兼容,自然取不到目标值。
正确实现逻辑
要实现根据SOAP请求中的addressId返回对应XML文件,需用WireMock的XPath提取XML参数 + 响应模板功能,步骤如下:
1. 启动WireMock时启用响应模板
启动独立版WireMock时,必须添加--global-response-templating参数,开启动态响应模板支持:
java -jar wiremock-jre8-standalone-2.35.0.jar --global-response-templating
2. 用XPath提取请求中的addressId
根据你的SOAP请求XML结构,编写对应的XPath表达式。假设请求结构如下:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <getAddressDetail> <addressType> <addressId>Q1004DB</addressId> </addressType> </getAddressDetail> </soap:Body> </soap:Envelope>
对应的XPath表达式为//addressType/addressId/text(),用于提取addressId的文本值。
如果请求包含自定义命名空间,比如:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:addr="http://your.company.com/address"> <soap:Body> <addr:getAddressDetail> <addr:addressType> <addr:addressId>Q1004DB</addr:addressId> </addr:addressType> </addr:getAddressDetail> </soap:Body> </soap:Envelope>
则需要指定命名空间映射,XPath表达式改为//addr:addressType/addr:addressId/text()。
3. 配置Stub规则
创建Stub配置文件(放在WireMock的mappings目录下,比如address-stub.json),内容如下:
无命名空间的情况
{ "request": { "method": "POST", "url": "/your-soap-endpoint", "bodyPatterns": [ { "matchesXPath": "//addressType/addressId" } ] }, "response": { "status": 200, "headers": { "Content-Type": "text/xml; charset=utf-8" }, "bodyFileName": "{{request.xpath('//addressType/addressId/text()')}}.xml", "transformers": ["response-template"] } }
带命名空间的情况
{ "request": { "method": "POST", "url": "/your-soap-endpoint", "bodyPatterns": [ { "matchesXPath": "//addr:addressType/addr:addressId", "xPathNamespaces": { "addr": "http://your.company.com/address" } } ] }, "response": { "status": 200, "headers": { "Content-Type": "text/xml; charset=utf-8" }, "bodyFileName": "{{request.xpath('//addr:addressType/addr:addressId/text()', {'addr': 'http://your.company.com/address'})}}.xml", "transformers": ["response-template"] } }
4. 放置响应XML文件
将你的Q1004DB.xml等响应文件,放在WireMock的__files目录下,确保文件名和addressId完全一致(包括大小写)。
关键注意事项
- 确认WireMock版本:响应模板功能在2.0+版本支持,建议使用较新版本。
- 文件名匹配严格:如果请求中的addressId是
Q1004DB,则响应文件必须命名为Q1004DB.xml,大小写完全对应。 - 命名空间必须完全匹配:XPath中的命名空间URL要和SOAP请求中的命名空间URL完全一致,不能有拼写错误。
内容的提问来源于stack exchange,提问作者KevinPB
相关产品推荐
相关产品推荐

