微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Wiremock 验证 Json 正文

如何解决使用 Wiremock 验证 Json 正文

我正在尝试使用 wiremock 根据 JSON 模式验证/匹配请求正文。 AFAIK,wiremock 没有对架构验证的一流支持,但仅支持 JSONPath。

不幸的是,我无法理解与有效请求正文匹配的正确 JSON-Path 表达式。

让我们假设,我有一个端点,您可以在其中发布/修补书名。应匹配以下请求正文:

{
   "title": "Harry Potter and the Philosopher's Stone"
}

使用 JsonPath 表达式轻松查找 title 属性

具有附加属性的请求主体应该有效。我事先不知道客户将发送哪些或多少附加属性,但以下文件应该 - 例如 - 不匹配:

{
   "title": "Harry Potter and the Philosopher's Stone","isbn": "0-7475-3269-9"
}
{
   "title": "Harry Potter and the Philosopher's Stone","isbn": "0-7475-3269-9","author": "J. K. Rowling"
}
{
   "title": "Harry Potter and the Philosopher's Stone","xyz": "bla-bla-bla"
}

JSON Path 表达式应该是什么样子的,以便只匹配只有标题的请求正文,而不匹配其他任何内容

或者,除了(滥用)wiremock 中的 JSONPath 之外,还有其他方法可以实现我的目标吗?

wiremock 在底层使用 Goessner's JSON-Path 实现,如果这有任何意义的话

解决方法

根据您要实现的目标,有几种选择。

如果您只需要匹配 title == "Harry Potter and the Philosopher's Stone" 的情况,并且这是 JSON 中唯一的字段,您可以简单地执行:

"bodyPatterns": [{
    "equalToJson": "{ \"title\": \"Harry Potter and the Philosopher's Stone\" }","ignoreExtraElements": false
}]

equalToJson 属性根据与您的匹配器等效的请求正文进行匹配。通过将 ignoreExtraElements 属性添加为 false,它将确保您具有绝对匹配。我相信 ignoreExtraElements 默认为 true,因此您必须明确将其设置为 false。

如果您需要匹配有标题值的任何情况,您将需要以下内容:

"bodyPatterns": [{
    "matchesJsonPath": "$.title"
},{
    "matchesJsonPath": "$[?(@.size() == 1)]"
}]

在此示例中,我们检查正文的 title 字段是否具有 some 值,然后还检查整个正文(在 JsonPath 中引用为 {{1} }) 的大小为 1。第二个 $ 符号正在做什么的细分:

  • matchesJsonPath -> 根对象(在本例中为整个请求正文)
  • $ -> 表示过滤表达式,需要括号来包裹表达式
  • ? -> 当前选中的元素(因为我们还没有从根向下钻取,它引用了根)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。