问题描述
我们有一个掩盖卡号的端点。我想用wiremock模拟这个端点。由于它将适用于多个卡号,因此我无法为每张卡准备单独的模拟文件。如何使用单个文件模拟此端点?发送的请求和对该请求的响应如下:
Request:
{
"cardNumber": "1234561234561234"
}
Response:
{
"maskedCard": "123456******1234"
}
{
"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"
}
}
}
您可能需要仔细研究一些细节,但是我认为这应该可以完成工作,或者至少可以帮助您完成大部分工作。