如何模拟在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"
        }
    }
}

您可能需要仔细研究一些细节,但是我认为这应该可以完成工作,或者至少可以帮助您完成大部分工作。