使用 Wiremock 检查请求正文中的空值
Check for null values in request body using Wiremock
我正在尝试设置一个 wiremock 存根,如果 json 有效负载中的任何字段具有空值,它将 return 出现 400 错误。基本上是模拟一个错误的请求。我一直在尝试使用匹配 json 键的任何小写字符串的正则表达式,但它似乎不喜欢它。我无法在网上找到任何我想要的示例,所以不确定是否可行。
我的错误请求正文:
{
"cat": null,
"dog": {
"id": 1344
},
"horse": {
"id": 1
},
"fish": 1
}
我的存根:
wireMockServer.stubFor(post(urlEqualTo("/sample-api"))
.withRequestBody(matchingJsonPath("$.^[a-z]*", equalTo(null)))
.willReturn(aResponse()
.withStatus(400)
.withHeader("Content-Type", "application/json")))
在此示例中,我希望存根与 "cat" 匹配,因为它的值为 null。事实并非如此。谁能告诉我我做错了什么?
在WireMock documentation on Request Matching the section on JSON Path matching. In the source code there is a reference to com.jayway.jsonpath.JsonPath
library used. The build.gradle refers to version 2.4.0. The documentation for the Jayway JSON Path library can be found on their Github project page. There is a good, but by no means perfect online evaluator here.
WireMock 文档仅显示对“matchesJsonPath". In the Jayway documenatation there is an online example: $..book[?(@.author =~ /.*REES/i)] 形式的节点值的正则表达式支持。因此,唯一的方法是命名所有不允许的节点 null
.
在下面的示例映射中,将测试所有提到的节点,无论它们的深度如何(参见@id)。如果所有提及的节点都不为空,但一些未提及的节点为空,则不会触发此映射。
{
"request": {
"urlPattern": "/sample-api",
"method": "GET",
"bodyPatterns" : [ {
"matchesJsonPath" : "$..[?(@.cat == null || @.dog == null || @.horse == null || @.fish == null || @.id == null)]"
} ]
},
"response": {
"status": "400",
"headers": {
"Content-Type": "application/json; charset=utf-8"
},
"jsonBody": {
"message": "some sapi message"
}
}
}
如果您不知道所有可能的键,您可以使用 Custom Request Matcher 检查请求正文是否包含任何空值,如果是,return 您的 400 错误。我建议创建您自己的 class,类似于...
public class BodyNullCheck extends RequestMatcherExtension {
@Override
public MatchResult match(Request request, Parameters parameters) {
JSONParser parser = new JSONParser();
try {
JSONObject body = (JSONObject) parser.parse(request.getBody().toString());
for(Iterator iterator = body.keySet().iterator(); iterator.hasNext();) {
String key = (String) iterator.next();
if (body.get(key) == null) {
return MatchResult.of(true);
}
}
} catch (ParseException ex) {
ex.printStackTrace();
}
return MatchResult.of(false);
}
}
上面获取请求主体并将其转换为 JSONObject,然后遍历 JSONObject 中的所有键。如果它们的任何值是 null
,那么我们将 return 为真。如果在遍历所有这些之后,没有找到 null
值,我们 return false。
我正在尝试设置一个 wiremock 存根,如果 json 有效负载中的任何字段具有空值,它将 return 出现 400 错误。基本上是模拟一个错误的请求。我一直在尝试使用匹配 json 键的任何小写字符串的正则表达式,但它似乎不喜欢它。我无法在网上找到任何我想要的示例,所以不确定是否可行。
我的错误请求正文:
{
"cat": null,
"dog": {
"id": 1344
},
"horse": {
"id": 1
},
"fish": 1
}
我的存根:
wireMockServer.stubFor(post(urlEqualTo("/sample-api"))
.withRequestBody(matchingJsonPath("$.^[a-z]*", equalTo(null)))
.willReturn(aResponse()
.withStatus(400)
.withHeader("Content-Type", "application/json")))
在此示例中,我希望存根与 "cat" 匹配,因为它的值为 null。事实并非如此。谁能告诉我我做错了什么?
在WireMock documentation on Request Matching the section on JSON Path matching. In the source code there is a reference to com.jayway.jsonpath.JsonPath
library used. The build.gradle refers to version 2.4.0. The documentation for the Jayway JSON Path library can be found on their Github project page. There is a good, but by no means perfect online evaluator here.
WireMock 文档仅显示对“matchesJsonPath". In the Jayway documenatation there is an online example: $..book[?(@.author =~ /.*REES/i)] 形式的节点值的正则表达式支持。因此,唯一的方法是命名所有不允许的节点 null
.
在下面的示例映射中,将测试所有提到的节点,无论它们的深度如何(参见@id)。如果所有提及的节点都不为空,但一些未提及的节点为空,则不会触发此映射。
{
"request": {
"urlPattern": "/sample-api",
"method": "GET",
"bodyPatterns" : [ {
"matchesJsonPath" : "$..[?(@.cat == null || @.dog == null || @.horse == null || @.fish == null || @.id == null)]"
} ]
},
"response": {
"status": "400",
"headers": {
"Content-Type": "application/json; charset=utf-8"
},
"jsonBody": {
"message": "some sapi message"
}
}
}
如果您不知道所有可能的键,您可以使用 Custom Request Matcher 检查请求正文是否包含任何空值,如果是,return 您的 400 错误。我建议创建您自己的 class,类似于...
public class BodyNullCheck extends RequestMatcherExtension {
@Override
public MatchResult match(Request request, Parameters parameters) {
JSONParser parser = new JSONParser();
try {
JSONObject body = (JSONObject) parser.parse(request.getBody().toString());
for(Iterator iterator = body.keySet().iterator(); iterator.hasNext();) {
String key = (String) iterator.next();
if (body.get(key) == null) {
return MatchResult.of(true);
}
}
} catch (ParseException ex) {
ex.printStackTrace();
}
return MatchResult.of(false);
}
}
上面获取请求主体并将其转换为 JSONObject,然后遍历 JSONObject 中的所有键。如果它们的任何值是 null
,那么我们将 return 为真。如果在遍历所有这些之后,没有找到 null
值,我们 return false。