Skip to main content
 首页 » 编程设计

xml之在 Wiremock 中评估返回 bool 值的表达式之请求匹配条件

2025年05月04日136lexus

尝试使用 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" 
      } 
    }  

出于安全原因,我不能在这里发布整个 SOAP 服务请求,但下面是 SOAP 服务的一小段,必须与映射条件中的 xpath 相匹配

<srvc:MyContentItemCodeList> 
    <data:MyContentItemCode>SD_12345</data:MyContentItemCode> 
    <data:MyContentItemCode>SD_22222</data:MyContentItemCode> 
</srvc:MyContentItemCodeList> 

如您所见,我正在尝试匹配映射条件中的两个“data:MyContentItemCode”标签。然而,wiremock 不承认/支持这一点。可能是因为 xpath 返回一个 bool 值。我的问题是 - 有没有办法在 Wiremock 中匹配 bool 值。

我没有在此处的 Wiremock 文档中找到示例:- http://wiremock.org/docs/request-matching/

当我将映射发布到 wiremock 服务器时,它确实发布成功,但是当我尝试访问 wiremock 服务器时,我没有取回我的虚拟化响应(即不考虑请求匹配)

如有任何帮助/指点,我们将不胜感激。

请您参考如下方法:

您面临的问题是您需要将元素/标签返回给匹配器。这可以通过使用根标签来完成。在这个例子中,我使用了你的例子暗示存在的 SOAP 信封标签。

仅返回根元素的机制是通过计算符合条件的元素的数量。如果两者都为真,则还返回根元素。下面的示例就是这样做的。

ma​​pping.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 对命名空间非常挑剔,因此请确保您拥有与请求中出现的标签相关联的正确命名空间。

请求http://localhost/dtag

<?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>