WireMock 可以回放来自多个域的请求吗?
Can WireMock play back requests from multiple domains?
我正在构建一个 Dockerised record-playback 系统来帮助我记录网站,这样我就可以针对本地版本而不是真实版本设计抓取工具。这意味着我不会因自动请求而淹没网站,而且还有一个额外的优势,即我不需要连接到网络即可工作。
我在内部使用了 Java-based WireMock,它使用 Wget 从 queue 的站点抓取中记录。我正在使用 WireMock API 从它记录的映射中读取各种信息。
但是,我从映射响应中发现域信息似乎没有被记录(除非它是在响应 headers 中意外记录的)。请参阅 __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
的最终记录中,考虑到我必须 我现在担心如果我记录不同的记录域,每个人的来源域都将丢失。
这意味着在播放模式下,WireMock 只能从一个域播放,我必须重新启动它并将其指向另一个缓存才能播放不同的站点。这对我的用例不可行,那么有没有办法解决这个问题?
(我已经用 Mountebank 做了一些工作,并且愿意切换到它,尽管我发现 WireMock 通常更容易使用。我对 Mountebank 的有限理解是它有同样的问题 single-domain 问题,虽然我很高兴在这方面得到纠正。我很乐意交换到任何强大的 open-source API-driven 记录器 HTTP 代理,如果放弃 WireMock 是唯一的前进方向)。
通过在您的请求中添加主机 header 条件,可以为多个域提供 WireMock 存根。假设您的 DNS/host 文件将所有相关域映射到您的 WireMock 服务器的 IP,那么这将导致它的行为类似于普通 Web 服务器上的虚拟主机。
主要问题是记录器不会将主机 header 添加到您的映射中,因此您之后需要自己执行此操作,或者破解记录器以即时执行此操作。
我一直在考虑为此添加更好的支持,所以请观看此 space。
我还建议查看 Hoverfly,它似乎已经很好地解决了这个问题。
我正在构建一个 Dockerised record-playback 系统来帮助我记录网站,这样我就可以针对本地版本而不是真实版本设计抓取工具。这意味着我不会因自动请求而淹没网站,而且还有一个额外的优势,即我不需要连接到网络即可工作。
我在内部使用了 Java-based WireMock,它使用 Wget 从 queue 的站点抓取中记录。我正在使用 WireMock API 从它记录的映射中读取各种信息。
但是,我从映射响应中发现域信息似乎没有被记录(除非它是在响应 headers 中意外记录的)。请参阅 __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
的最终记录中,考虑到我必须
这意味着在播放模式下,WireMock 只能从一个域播放,我必须重新启动它并将其指向另一个缓存才能播放不同的站点。这对我的用例不可行,那么有没有办法解决这个问题?
(我已经用 Mountebank 做了一些工作,并且愿意切换到它,尽管我发现 WireMock 通常更容易使用。我对 Mountebank 的有限理解是它有同样的问题 single-domain 问题,虽然我很高兴在这方面得到纠正。我很乐意交换到任何强大的 open-source API-driven 记录器 HTTP 代理,如果放弃 WireMock 是唯一的前进方向)。
通过在您的请求中添加主机 header 条件,可以为多个域提供 WireMock 存根。假设您的 DNS/host 文件将所有相关域映射到您的 WireMock 服务器的 IP,那么这将导致它的行为类似于普通 Web 服务器上的虚拟主机。
主要问题是记录器不会将主机 header 添加到您的映射中,因此您之后需要自己执行此操作,或者破解记录器以即时执行此操作。
我一直在考虑为此添加更好的支持,所以请观看此 space。
我还建议查看 Hoverfly,它似乎已经很好地解决了这个问题。