使用 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。