如何模拟在 Wiremock 中屏蔽卡号的端点?

How to mock an endpoint that masked the card number in Wiremock?

我们有一个屏蔽卡号的端点。我想用 Wiremock 模拟这个端点。因为它适用于多个卡号,所以我不可能为每张卡准备一个单独的模拟文件。如何使用单个文件模拟此端点?本次请求发送的请求和返回的响应如下:

Request:
{
    "cardNumber": "1234561234561234"
}
Response:
{
    "maskedCard": "123456******1234"
}

我准备了一个仅适用于 1 个卡号的 Wiremock 文件:

{
    "request": {
        "method": "POST",
        "url": "/maskedCard",
        "bodyPatterns": [
            {
                "matchesJsonPath": "[?(@.cardNumber == '1234561234561234')]"
            }
        ]
    },
    "response": {
        "status": 200,
        "headers": {
            "Content-Type": "application/json"
        },
        "jsonBody": {
            "maskedCard": "123456******1234"
        }
    }
}

我怎样才能对所有传入的卡号进行这项工作?

如果附加到请求的 cardNumber 无关紧要,那么我将排除 bodyPatterns 进行匹配。

{
    "request": {
        "method": "POST",
        "url": "/maskedCard"
    }

如果您随后需要获取请求正文中的任何 cardNumber 并对其进行屏蔽,我不知道有任何开箱即用的解决方案可以为您做到这一点。相反,您必须编写一个 Response Transformer 来将未屏蔽的 cardNumber 更改为屏蔽的 CardNumber。像...

public class MaskCardNumbers extends ResponseTransformer {

    public String getName() {
        return "MaskCardNumbers";
    }

    @Override
    public Response transform(Request request, Response response, FileSource files, Parameters parameters) {
        Pattern pattern = Pattern.compile("/maskedCard");
        Matcher matcher = pattern.matcher(request.getUrl());
        if(matcher.matches()) { 
            // Logic to extract cardNumber - my library of choice is JsonSimple
            JSONObject responseBody = (JSONObject) parser.parse(response.getBodyAsString());
            String cardNumber = responseBody.get("cardNumber").toString();
            
            // Logic to replace cardNumber
            String maskedCard = "";
            for (int i = 0; i < cardNumber.length(); i++) {
                if (i < 6 || i > 11) {
                    maskedCard += cardNumber.charAt(i);
                } else {
                    maskedCard += "*";
                }
            }

            // Create response JSON Object
            JSONObject responseObject = new JSONObject();
            responseObject.put("cardNumber", maskedCard)

            // Return responseObject
                            return Response.Builder.like(response).but().body(responseBody.toJSONString()).build();
        }
    }
}       

然后您需要确保 WireMock launches with the transformer attached. 最后,您的映射如下所示:

{
    "request": {
        "method": "POST",
        "url": "/maskedCard"
    },
    "response": {
        "status": 200,
        "headers": {
            "Content-Type": "application/json"
        },
        "jsonBody": {
            "maskedCard": "123456******1234"
        }
    }
}

您可能需要尝试一些细节,但我认为这应该可以完成工作,或者至少让您完成大部分工作。