Wiremock 代理记录功能 - 它可以在响应中替换 Host 或 IP 吗?
Wiremock proxy record feature - can it replace Host or IP in responses?
我正在用 wiremock 录制休息 api...在我的情况下是 SharePoint。
所以我设置了一个记录器:
java -jar wiremock-standalone-2.18.0.jar
现在我去http://localhost:8080/__admin/recorder/ and I enable recording for my http://sharepointhost。
现在,我通过 http://localhost:8080 提出一些共享点休息 apis 的请求。
但其余 api 回复仍然引用 http://sharepointhost。
有没有办法打开某种反向代理或 URL 模式字符串替换来避免这个问题?就我而言,这样做的方法是什么?我是否需要使用 Java 种类的录音机而不是使用独立录音机?
是的。您可以使用自动记录模式将 WireMock 作为代理启动。您需要的命令是:
java -jar wiremock-standalone-2.18.0.jar --port 8787 --print-all-network-traffic --verbose --enable-browser-proxying --record-映射
重要的参数有 enable-browser-proxying 和 record-mappings
代理 运行 在端口 8787 上,您必须将浏览器配置为使用代理 localhost:8787
现在你可以浏览任何网站,所有的流量都会被记录下来。
WireMock 支持 "Extensions." 并且有一些预打包的扩展类型称为 "Transformers."
有一种扩展类型允许您拦截 http 请求的响应。然后您可以在这里替换响应的内容。
见http://wiremock.org/docs/extending-wiremock/
我创建了一个 GitHub 存储库,其中包含响应正文 URL 重写扩展:
https://github.com/nddipiazza/wiremock-response-body-url-rewriter
public class ResponseBodyUrlRewriteTransformer extends ResponseTransformer {
final int wiremockPort;
final String wiremockBindAddress;
final private List<String> urlsToReplace;
public ResponseBodyUrlRewriteTransformer(String wiremockBindAddress, int wiremockPort, List<String> urlsToReplace) {
this.urlsToReplace = urlsToReplace;
this.wiremockBindAddress = wiremockBindAddress;
this.wiremockPort = wiremockPort;
}
private String replaceUrlsInBody(String bodyText) {
for (String urlToReplace : urlsToReplace) {
bodyText = bodyText.replaceAll(Pattern.quote(urlToReplace),
"http://" + wiremockBindAddress + ":" + wiremockPort);
}
return bodyText;
}
@Override
public Response transform(Request request, Response response, FileSource files, Parameters parameters) {
if (response.getStatus() == 200) {
ContentTypeHeader contentTypeHeader = response.getHeaders().getContentTypeHeader();
if (contentTypeHeader != null && contentTypeHeader.mimeTypePart().contains("xml")) {
return Response.response()
.body(replaceUrlsInBody(response.getBodyAsString()))
.headers(response.getHeaders())
.status(response.getStatus())
.statusMessage(response.getStatusMessage())
.fault(response.getFault())
.chunkedDribbleDelay(response.getChunkedDribbleDelay())
.fromProxy(response.isFromProxy())
.build();
}
}
return response;
}
@Override
public String getName() {
return "ResponseBodyUrlRewriteTransformer";
}
}
我正在用 wiremock 录制休息 api...在我的情况下是 SharePoint。
所以我设置了一个记录器:
java -jar wiremock-standalone-2.18.0.jar
现在我去http://localhost:8080/__admin/recorder/ and I enable recording for my http://sharepointhost。
现在,我通过 http://localhost:8080 提出一些共享点休息 apis 的请求。
但其余 api 回复仍然引用 http://sharepointhost。
有没有办法打开某种反向代理或 URL 模式字符串替换来避免这个问题?就我而言,这样做的方法是什么?我是否需要使用 Java 种类的录音机而不是使用独立录音机?
是的。您可以使用自动记录模式将 WireMock 作为代理启动。您需要的命令是:
java -jar wiremock-standalone-2.18.0.jar --port 8787 --print-all-network-traffic --verbose --enable-browser-proxying --record-映射
重要的参数有 enable-browser-proxying 和 record-mappings
代理 运行 在端口 8787 上,您必须将浏览器配置为使用代理 localhost:8787
现在你可以浏览任何网站,所有的流量都会被记录下来。
WireMock 支持 "Extensions." 并且有一些预打包的扩展类型称为 "Transformers."
有一种扩展类型允许您拦截 http 请求的响应。然后您可以在这里替换响应的内容。
见http://wiremock.org/docs/extending-wiremock/
我创建了一个 GitHub 存储库,其中包含响应正文 URL 重写扩展:
https://github.com/nddipiazza/wiremock-response-body-url-rewriter
public class ResponseBodyUrlRewriteTransformer extends ResponseTransformer {
final int wiremockPort;
final String wiremockBindAddress;
final private List<String> urlsToReplace;
public ResponseBodyUrlRewriteTransformer(String wiremockBindAddress, int wiremockPort, List<String> urlsToReplace) {
this.urlsToReplace = urlsToReplace;
this.wiremockBindAddress = wiremockBindAddress;
this.wiremockPort = wiremockPort;
}
private String replaceUrlsInBody(String bodyText) {
for (String urlToReplace : urlsToReplace) {
bodyText = bodyText.replaceAll(Pattern.quote(urlToReplace),
"http://" + wiremockBindAddress + ":" + wiremockPort);
}
return bodyText;
}
@Override
public Response transform(Request request, Response response, FileSource files, Parameters parameters) {
if (response.getStatus() == 200) {
ContentTypeHeader contentTypeHeader = response.getHeaders().getContentTypeHeader();
if (contentTypeHeader != null && contentTypeHeader.mimeTypePart().contains("xml")) {
return Response.response()
.body(replaceUrlsInBody(response.getBodyAsString()))
.headers(response.getHeaders())
.status(response.getStatus())
.statusMessage(response.getStatusMessage())
.fault(response.getFault())
.chunkedDribbleDelay(response.getChunkedDribbleDelay())
.fromProxy(response.isFromProxy())
.build();
}
}
return response;
}
@Override
public String getName() {
return "ResponseBodyUrlRewriteTransformer";
}
}