java - Wiremock 代理记录功能 - 它可以替代响应中的 Host 或 IP 吗?

标签 java wiremock

我正在使用wiremock记录rest api...以我的SharePoint为例。

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

java -jarwiremock-standalone-2.18.0.jar

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

现在我通过 http://localhost:8080 向 sharepoint Rest api 发出一些请求。

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

有没有办法打开某种反向代理或 URL 模式字符串替换,以便我可以避免此问题?就我而言,有什么方法可以做到这一点?我是否需要使用 Java 版本的记录器而不是使用独立的记录器?

最佳答案

WireMock 支持“扩展”。还有一些预先打包的扩展类型,称为“Transformers”。

有一种扩展类型允许您拦截 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";
  }
}

关于java - Wiremock 代理记录功能 - 它可以替代响应中的 Host 或 IP 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51960907/

相关文章:

java - Wiremock 对于 stub url 返回 404

java - 如何为 webview 创建包装器对象

java - 无法反序列化 Wiremock Json 文件配置中收到的 START_ARRAY token 异常中的 `java.lang.String` 实例

wiremock - 使wiremock接受任何证书

linux - 无法在 WireMock 中访问 _admin

android - 在 Android 上模拟服务器结果(Wiremock、MockWebServer 等)

java - 嵌套同步块(synchronized block)

java - 在 weblogic 服务器上将 enforce-valid-basic-auth-credentials 设置为 false 会产生什么后果

java - 当不断添加随机 double 直到达到特定距离时,无法使 while() 循环工作

java - 如何使用文件作为参数创建 BufferedImage 的新类