当前位置: 首页 > 知识库问答 >
问题:

计算在Wiremock-Request匹配条件中返回布尔值的表达式

唐俊爽
2023-03-14

尝试使用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返回了一个布尔值。我的问题是-有没有办法在Wiremock中匹配布尔值。

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

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

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

共有1个答案

通远
2023-03-14

您面临的问题是,您需要向匹配器返回一个元素/标签。这可以通过使用根标签来完成。在这个例子中,我使用了soap envelope标签。

只返回根元素的机制是通过计算符合标准的元素的数量。如果两者都为真,那么也返回根元素。下面的例子就是这样做的。

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对命名空间非常挑剔,请确保您具有与请求中显示的标签关联的正确命名空间。

请求 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>
 类似资料:
  • 我使用wiremock来模拟某些请求及其相应的响应,但我试图添加一个正则表达式。不幸的是,这只会引发一个异常,表明请求不匹配。 我也试过了 我发送的请求是

  • 下面是我的输入,我试图使用提取显示的输出。我想删除键名在value(在之后)中匹配的对,如果在分隔的值中有多个,我想保留它们。 预期产出: 如果我有所有字符串,这个问题就可以解决,但是当我在中有值时,这个问题就失败了。使用yq/sed/grep提取与YAML中的正则表达式匹配的键值对 我得到以下错误: 错误:无法替换为!!布尔,只能替换字符串。提示:对于此操作,您通常需要在“=”上使用“|=”键。

  • 问题内容: 所以我有一个关于考试作业的问题,在这个作业中,我们有一堆布尔表达式,例如: 然后,我们应该编写布尔表达式的值。为此,我使用了三值逻辑,但是当您获得如下所示的布尔表达式时,这将如何应用: 或者 通过三值逻辑可以很容易地找到第一个,但是我如何找出另外两个。 我知道这是一个非常基本的问题,但是我对此仍然是陌生的。 提前致谢 问题答案: 您需要布尔值和的三相真值表: 该表是缩写,依赖于布尔逻辑

  • 我正在寻找一种相对简单的(与编写解析器相比)方法来计算Java中的布尔表达式,我不想使用JEP库。 我有一个字符串表达式,如:

  • 问题内容: 我想编写一个正则表达式来计算文本块中空格/制表符/换行符的数量。所以我天真地写了以下内容: 由于某些未知原因,它总是返回。上面的陈述有什么问题?此后,我通过以下方法解决了该问题: 问题答案: tl; dr:通用模式计数器 对于那些来到这里的人来说,他们正在寻找一种通用的方法来计算字符串中正则表达式模式的出现次数,并且如果出现的次数为零,也不希望它失败,那么您需要的是这段代码。这是一个示

  • 我正试图做到这一点: 我得到一个错误: 我已经测试了正则表达式,它是有效的。我还进行了调试,发现regexpatern也匹配。但出于某种原因,我仍然会犯这个错误。我认为我用错了。 我尝试了一个更简单的版本,但也没有成功: 有什么想法吗?提前感谢。