Wiremock代理记录功能-它可以代替主机或IP响应吗?

时间:2018-08-22 06:25:48

标签: java wiremock

我正在使用Wiremock记录剩余api ...以我的SharePoint为例。

所以我设置了一个录音机:

java -jar wiremock-standalone-2.18.0.jar

现在,我转到http://localhost:8080/__admin/recorder/,并为我的http://sharepointhost启用录音。

现在,我通过http://localhost:8080提出了一些共享Rest API的请求。

但是其余的api响应仍引用http://sharepointhost

是否有一种方法可以打开某种反向代理或URL模式字符串替换,从而可以避免此问题?在我的情况下,该怎么做?我需要使用记录器的Java品种而不是独立的吗?

2 个答案:

答案 0 :(得分:2)

WireMock支持“扩展”。并且有一些预打包的扩展类型,称为“变形金刚”。

有一个扩展类型,允许您截获http请求的响应。然后,您可以在此处替换响应的内容。

请参见http://wiremock.org/docs/extending-wiremock/

我创建了一个带有响应正文URL重写扩展名的GitHub存储库:

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

答案 1 :(得分:0)

是的。您可以将WireMock作为具有自动记录模式的代理启动。您需要的命令是这样的:

java -jar wiremock-standalone-2.18.0.jar --port 8787 --print-all-network-traffic --verbose --enable-browser-proxying --record-mappings

其中的重要参数有启用浏览器代理记录映射

代理在端口8787上运行,您必须将浏览器配置为使用代理localhost:8787

现在您可以浏览任何网站,所有流量都会被记录。