【问题标题】:Can WireMock play back requests from multiple domains?WireMock 可以回放来自多个域的请求吗?
【发布时间】:2023-03-29 09:30:02
【问题描述】:

我正在构建一个 Dockerised 记录播放系统来帮助我记录网站,这样我就可以设计一个本地版本而不是真实版本的爬虫。这意味着我不会用自动请求淹没网站,并且具有额外的优势,即我无需连接到网络即可工作。

我在内部使用了基于 Java 的 WireMock,它使用 Wget 从站点抓取队列中记录。我正在使用WireMock API 从它记录的映射中读取各种片段信息。

但是,我从映射响应中发现域信息似乎没有被记录(除非它在响应标头中意外出现)。请参阅__admin/mappings 的以下回复:

{

    "result": {
        "ok": true,
        "list": [
            {
                "id": "794d609f-99b9-376d-b6b8-04dab161c023",
                "uuid": "794d609f-99b9-376d-b6b8-04dab161c023",
                "request": {
                    "url": "/robots.txt",
                    "method": "GET"
                },
                "response": {
                    "status": 404,
                    "bodyFileName": "body-robots.txt-j9qqJ.txt",
                    "headers": {
                        "Server": "nginx/1.0.15",
                        "Date": "Wed, 04 Jan 2017 21:04:40 GMT",
                        "Content-Type": "text/html",
                        "Connection": "keep-alive"
                    }
                }
            },
            {
                "id": "e246fac2-f9ad-3799-b7b7-066941408b8b",
                "uuid": "e246fac2-f9ad-3799-b7b7-066941408b8b",
                "request": {
                    "url": "/about/careers/",
                    "method": "GET"
                },
                "response": {
                    "status": 200,
                    "bodyFileName": "body-about-careers-GhVqy.txt",
                    "headers": {
                        "Server": "nginx/1.0.15",
                        "Date": "Wed, 04 Jan 2017 21:04:35 GMT",
                        "Content-Type": "text/html",
                        "Last-Modified": "Wed, 04 Jan 2017 12:52:12 GMT",
                        "Connection": "keep-alive",
                        "X-CACHE-URI": "/about/careers/",
                        "Accept-Ranges": "bytes"
                    }
                }
            },
            {
                "id": "def378f5-a93c-333e-9663-edcd30c936d7",
                "uuid": "def378f5-a93c-333e-9663-edcd30c936d7",
                "request": {
                    "url": "/about/careers/feed/",
                    "method": "GET"
                },
                "response": {
                    "status": 200,
                    "bodyFileName": "body-careers-feed-Fd2fO.xml",
                    "headers": {
                        "Server": "nginx/1.0.15",
                        "Date": "Wed, 04 Jan 2017 21:04:45 GMT",
                        "Content-Type": "application/rss+xml; charset=UTF-8",
                        "Transfer-Encoding": "chunked",
                        "Connection": "keep-alive",
                        "X-Powered-By": "PHP/5.3.3",
                        "Vary": "Cookie",
                        "X-Pingback": "http://www.example.com/xmlrpc.php",
                        "Last-Modified": "Thu, 06 Jun 2013 14:01:52 GMT",
                        "ETag": "\"765fc03186b121a764133349f8b716df\"",
                        "X-Robots-Tag": "noindex, follow",
                        "Link": "<http://www.example.com/?p=2680>; rel=shortlink",
                        "X-CACHE-URI": "null cache"
                    }
                }
            },
            {
                "id": "616ca6d7-6e57-4c10-8b57-f6f3dabc0930",
                "uuid": "616ca6d7-6e57-4c10-8b57-f6f3dabc0930",
                "request": {
                    "method": "ANY"
                },
                "response": {
                    "status": 200,
                    "proxyBaseUrl": "http://www.example.com"
                },
                "priority": 10
            }
        ]
    }

}

唯一清晰的 URL 记录是在针对 proxyBaseUrl 的最终条目中,鉴于我必须使用 specify a URL in the console call,我现在担心如果我针对不同的域进行记录,每个来自的域将迷路了。

这意味着在播放模式下,WireMock 只能从一个域播放,我必须重新启动它并将其指向另一个缓存才能播放不同的站点。这不适用于我的用例,有没有办法解决这个问题?

(我已经使用Mountebank 做了一些工作,并且愿意切换到它,尽管我发现 WireMock 通常更易于使用。我对 Mountebank 的有限理解是它存在相同的单域问题,虽然我很高兴得到纠正。如果放弃 WireMock 是唯一的前进方式,我很乐意换成任何强大的开源 API 驱动的记录器 HTTP 代理。

【问题讨论】:

    标签: java proxy wiremock


    【解决方案1】:

    通过在您的请求中添加 Host 标头条件,可以为多个域提供 WireMock 存根。假设您的 DNS/host 文件将所有相关域映射到您的 WireMock 服务器的 IP,那么这将导致它的行为类似于普通 Web 服务器上的虚拟主机。

    主要问题是记录器不会将主机标头添加到您的映射中,因此您需要事后自己执行此操作,或者破解记录器以即时执行此操作。

    我一直在考虑为此添加更好的支持,所以请注意这个空间。

    我还建议检查一下 Hoverfly,它似乎已经很好地解决了这个问题。

    【讨论】:

    • 啊,太棒了,谢谢汤姆-我会试试这个。由于recording is per-domain anyway,我想我可以在记录阶段结束时修改新请求。
    • Hoverfly 看起来确实很有趣,但在 its HTTP API 中没有提供按 ID 删除的功能,我想我会需要它。但是,您是对的,它似乎已经从多个域记录和提供服务,所以这也许是一个很好的备份计划。
    • 啊哈,我之前被困在如何在请求系统中添加过滤器,相信它是简单的键值对。我刚刚发现了如何做到这一点from here,所有这些都有很好的记录!
    • 我刚刚使用 PHP 设置了curl with a proxy,这确实很好地从 WireMock 获取!再次感谢。我什至不需要重置 DNS/host 文件以指向代理 - 指定代理地址似乎就足够了。
    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2015-07-03
    相关资源
    最近更新 更多