如何解决使用 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 举报,一经查实,本站将立刻删除。