在 Wiremock 中评估 returns 布尔值的表达式 - 请求匹配条件
Evaluate an expression that returns a boolean value in Wiremock - Request matching criteria
尝试使用 Wiremock 作为虚拟化 SOAP 服务的工具。
请求映射标准如下所示:-
映射条件:
{
"request":{
"method":"POST",
"urlPattern":"/myServices/mycontent.asgx",
"headers":{
"SOAPAction":{
"contains":"#SearchMyContent"
}
},
"bodyPatterns":[{
**"matchesXPath":"//data:MyContentItemCode[contains(text(), 'SD_12345')] and //MyContentItemCode[contains(text(), 'SD_22222')]",**
"xPathNamespaces":{
"SOAP-ENV": "http://schemas.xmlsoap.org/soap/envelope/",
"data":"http://www.ins.com/insi/1.0/insi-data",
"msg":"http://www.ins.com/insi/1.0/insi-messaging",
"nc":"http://www.ins.com/insi/1.0/insi-non-compliant",
"soapenv":"http://schemas.xmlsoap.org/soap/envelope/",
"srvc":"http://www.ins.com/insi/1.0/insi-services"
}
}]
},
"response":{
"status":200,
"headers":{
"Content-Type":"text/xml;charset=utf-8"
},
"body":"encoded_XML_body"
}
}
出于安全原因,我不能在此处post整个 SOAP 服务请求,但下面是 SOAP 服务的一小段,必须与映射条件中的 xpath 相匹配
<srvc:MyContentItemCodeList>
<data:MyContentItemCode>SD_12345</data:MyContentItemCode>
<data:MyContentItemCode>SD_22222</data:MyContentItemCode>
</srvc:MyContentItemCodeList>
如您所见,我正在尝试匹配映射条件中的两个“data:MyContentItemCode”标签。但是,wiremock 不会 recognize/support 这个。可能是因为 xpath returns 是一个布尔值。我的问题是 - 有没有办法在 Wiremock 中匹配布尔值。
我没有在此处的 Wiremock 文档中找到示例:- http://wiremock.org/docs/request-matching/
当我 post 到 wiremock 服务器的映射时,它确实成功 posted 但是当我尝试访问 wiremock 服务器时,我没有取回我的虚拟化响应(即请求不考虑匹配)
如有任何帮助/指点,我们将不胜感激。
您面临的问题是您需要 return 一个 element/tag 到匹配器。这可以通过使用根标签来完成。在这个例子中,我使用了你的例子暗示存在的肥皂信封标签。
仅 return 根元素的机制是计算符合条件的元素数量。如果两者都为真,则根元素也被 returned。下面的例子就是这样做的。
mapping.json
{
"request":{
"method":"POST",
"urlPattern":"/dtag",
"bodyPatterns":[{
"matchesXPath":"/SOAP-ENV:Envelope[count(//data:MyContentItemCode[contains(text(), 'SD_12345')])=1 and count(//data:MyContentItemCode[contains(text(), 'SD_22222')] )=1]",
"xPathNamespaces":{
"SOAP-ENV": "http://schemas.xmlsoap.org/soap/envelope/",
"data":"http://www.ins.com/insi/1.0/insi-data",
"srvc":"http://www.ins.com/insi/1.0/insi-services"
}
}]
},
"response":{
"status":200,
"headers":{
"Content-Type":"text/xml;charset=utf-8"
},
"body":"encoded_XML_body"
}
}
下面的 XML 通过 POST 请求发送到下面的 URL。由于 WireMock 对命名空间非常挑剔,因此请确保您拥有与请求中出现的标签相关联的正确命名空间。
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"
xmlns:data="http://www.ins.com/insi/1.0/insi-data"
xmlns:srvc="http://www.ins.com/insi/1.0/insi-services">
<srvc:MyContentItemCodeList >
<data:MyContentItemCode>SD_12345</data:MyContentItemCode>
<data:MyContentItemCode>SD_22222</data:MyContentItemCode>
</srvc:MyContentItemCodeList>
</soap:Envelope>
尝试使用 Wiremock 作为虚拟化 SOAP 服务的工具。
请求映射标准如下所示:-
映射条件:
{
"request":{
"method":"POST",
"urlPattern":"/myServices/mycontent.asgx",
"headers":{
"SOAPAction":{
"contains":"#SearchMyContent"
}
},
"bodyPatterns":[{
**"matchesXPath":"//data:MyContentItemCode[contains(text(), 'SD_12345')] and //MyContentItemCode[contains(text(), 'SD_22222')]",**
"xPathNamespaces":{
"SOAP-ENV": "http://schemas.xmlsoap.org/soap/envelope/",
"data":"http://www.ins.com/insi/1.0/insi-data",
"msg":"http://www.ins.com/insi/1.0/insi-messaging",
"nc":"http://www.ins.com/insi/1.0/insi-non-compliant",
"soapenv":"http://schemas.xmlsoap.org/soap/envelope/",
"srvc":"http://www.ins.com/insi/1.0/insi-services"
}
}]
},
"response":{
"status":200,
"headers":{
"Content-Type":"text/xml;charset=utf-8"
},
"body":"encoded_XML_body"
}
}
出于安全原因,我不能在此处post整个 SOAP 服务请求,但下面是 SOAP 服务的一小段,必须与映射条件中的 xpath 相匹配
<srvc:MyContentItemCodeList>
<data:MyContentItemCode>SD_12345</data:MyContentItemCode>
<data:MyContentItemCode>SD_22222</data:MyContentItemCode>
</srvc:MyContentItemCodeList>
如您所见,我正在尝试匹配映射条件中的两个“data:MyContentItemCode”标签。但是,wiremock 不会 recognize/support 这个。可能是因为 xpath returns 是一个布尔值。我的问题是 - 有没有办法在 Wiremock 中匹配布尔值。
我没有在此处的 Wiremock 文档中找到示例:- http://wiremock.org/docs/request-matching/
当我 post 到 wiremock 服务器的映射时,它确实成功 posted 但是当我尝试访问 wiremock 服务器时,我没有取回我的虚拟化响应(即请求不考虑匹配)
如有任何帮助/指点,我们将不胜感激。
您面临的问题是您需要 return 一个 element/tag 到匹配器。这可以通过使用根标签来完成。在这个例子中,我使用了你的例子暗示存在的肥皂信封标签。
仅 return 根元素的机制是计算符合条件的元素数量。如果两者都为真,则根元素也被 returned。下面的例子就是这样做的。
mapping.json
{
"request":{
"method":"POST",
"urlPattern":"/dtag",
"bodyPatterns":[{
"matchesXPath":"/SOAP-ENV:Envelope[count(//data:MyContentItemCode[contains(text(), 'SD_12345')])=1 and count(//data:MyContentItemCode[contains(text(), 'SD_22222')] )=1]",
"xPathNamespaces":{
"SOAP-ENV": "http://schemas.xmlsoap.org/soap/envelope/",
"data":"http://www.ins.com/insi/1.0/insi-data",
"srvc":"http://www.ins.com/insi/1.0/insi-services"
}
}]
},
"response":{
"status":200,
"headers":{
"Content-Type":"text/xml;charset=utf-8"
},
"body":"encoded_XML_body"
}
}
下面的 XML 通过 POST 请求发送到下面的 URL。由于 WireMock 对命名空间非常挑剔,因此请确保您拥有与请求中出现的标签相关联的正确命名空间。
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"
xmlns:data="http://www.ins.com/insi/1.0/insi-data"
xmlns:srvc="http://www.ins.com/insi/1.0/insi-services">
<srvc:MyContentItemCodeList >
<data:MyContentItemCode>SD_12345</data:MyContentItemCode>
<data:MyContentItemCode>SD_22222</data:MyContentItemCode>
</srvc:MyContentItemCodeList>
</soap:Envelope>