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-proxyingrecord-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";
  }
}