XML 与 Wiremock 匹配
XML Matching with Wiremock
我正在使用 wiremock 设置虚拟 PHP 服务器,并希望根据传递的 XML 字段之一进行匹配。我基本上会有多个请求进入同一个 url,但它们之间的主要区别在于发票编号。我的 JSON 线模看起来像这样
{
"request": {
"method": "ANY",
"urlPattern": ".*/test.php",
"bodyPatterns" : [{
"equalToXml": "<InvoiceNumber>6</InvoiceNumber>"
}]
},
"response": {
"status": 200,
"bodyFileName": "sample.xml",
"headers": {
"Content-Type": "application/xml"
}
}
}
当我使用 Postman 并且只通过 <InvoiceNumber></InvoiceNumber>
字段传递 XML 时,这工作正常,但是当我添加辅助字段时它失败了。
我希望能够将任何 Xml 传递给 wiremock,只要它具有 <InvoiceNumber></InvoiceNumber>
字段,它就会读取它。
使用正则表达式方法找到解决方案并使用 matches
而不是 equalToXml
{
"request": {
"method": "ANY",
"urlPattern": ".*/test.php",
"bodyPatterns" : [{
"matches": ".*<InvoiceNumber>6</InvoiceNumber>.*"
}]
},
"response": {
"status": 200,
"bodyFileName": "sample.xml",
"headers": {
"Content-Type": "application/xml"
}
}
}
您可能希望改用 XPath 匹配,如 WireMock documentation 中所述。 WireMock 有一些不错的 XML 功能,包括占位符,值得保留。
XPath
如果属性值有效 XML 并且与提供的 XPath 表达式相匹配,则视为匹配。如果 XPath 评估返回任何元素,则 XML 文档将被视为匹配。 WireMock 委托给 Java 的内置 XPath 引擎(通过 XMLUnit),因此直到(至少)Java 8 它支持 XPath 版本 1.0。
Java:
.withRequestBody(matchingXPath("//InvoiceNumber[text()='6']"))
JSON:
{ "request": {
...
"bodyPatterns" : [ {
"matchesXPath" : "//InvoiceNumber[text()='6']"
} ]
... }, ... }
我正在使用 wiremock 设置虚拟 PHP 服务器,并希望根据传递的 XML 字段之一进行匹配。我基本上会有多个请求进入同一个 url,但它们之间的主要区别在于发票编号。我的 JSON 线模看起来像这样
{
"request": {
"method": "ANY",
"urlPattern": ".*/test.php",
"bodyPatterns" : [{
"equalToXml": "<InvoiceNumber>6</InvoiceNumber>"
}]
},
"response": {
"status": 200,
"bodyFileName": "sample.xml",
"headers": {
"Content-Type": "application/xml"
}
}
}
当我使用 Postman 并且只通过 <InvoiceNumber></InvoiceNumber>
字段传递 XML 时,这工作正常,但是当我添加辅助字段时它失败了。
我希望能够将任何 Xml 传递给 wiremock,只要它具有 <InvoiceNumber></InvoiceNumber>
字段,它就会读取它。
使用正则表达式方法找到解决方案并使用 matches
而不是 equalToXml
{
"request": {
"method": "ANY",
"urlPattern": ".*/test.php",
"bodyPatterns" : [{
"matches": ".*<InvoiceNumber>6</InvoiceNumber>.*"
}]
},
"response": {
"status": 200,
"bodyFileName": "sample.xml",
"headers": {
"Content-Type": "application/xml"
}
}
}
您可能希望改用 XPath 匹配,如 WireMock documentation 中所述。 WireMock 有一些不错的 XML 功能,包括占位符,值得保留。
XPath
如果属性值有效 XML 并且与提供的 XPath 表达式相匹配,则视为匹配。如果 XPath 评估返回任何元素,则 XML 文档将被视为匹配。 WireMock 委托给 Java 的内置 XPath 引擎(通过 XMLUnit),因此直到(至少)Java 8 它支持 XPath 版本 1.0。
Java:
.withRequestBody(matchingXPath("//InvoiceNumber[text()='6']"))
JSON:
{ "request": {
...
"bodyPatterns" : [ {
"matchesXPath" : "//InvoiceNumber[text()='6']"
} ]
... }, ... }