如何模拟在 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"
}
}
}
您可能需要尝试一些细节,但我认为这应该可以完成工作,或者至少让您完成大部分工作。
我们有一个屏蔽卡号的端点。我想用 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"
}
}
}
您可能需要尝试一些细节,但我认为这应该可以完成工作,或者至少让您完成大部分工作。