WireMock:临时禁用存根响应



我使用WireMock来存根来自远程服务器的响应。 在文件夹wiremock/mappings中,我有许多设置存根规则的文件。 这里的例子:

{

"request": {
"method": "GET",
"url": "/merchant"
},
"response": {
"headers": {
"Content-Type": "application/json"
},
"status": 200,
"fixedDelayMilliseconds": 3000,
"bodyFileName": "stub_response.json"
}
}

如您所见,当我收到请求/merchant然后从文件stub_response.json返回存根响应时。 好。它工作正常。

但假设我需要临时禁用此响应。是否可以关闭存根响应并从远程服务器返回真实响应?

我需要这样的标志:"disable" : true

在WireMock中可能吗?

您可以使用 WireMock 管理界面禁用规则。 如果对http://.../__admin/mappings/<guid>调用 DELETE 命令,则将删除映射。

可以通过对 GET 命令来获取所有 guid 的列表http://.../__admin/

如果要将映射替换为实际响应而不是存根响应,则可以添加第二个映射,该映射的优先级低于存根响应,并且代理到实际地址。 通常,您的存根响应不会被使用,但是当您删除存根响应时,Wiremock 将代理到真实地址,因为它将成为最高优先级的映射。

要添加代理,请将以下内容添加到响应映射中

"proxyBaseUrl" : "http://otherhost.com",

若要设置映射的优先级,请将以下内容添加到映射 JSON 中。

"priority": 1,

目前没有规则的禁用属性。您可以删除 wiremock 规则,稍后再重新添加它,这在功能上是相同的。

如果您将 Wiremock 作为独立进程运行,则可以将其设置为记录模式,这实际上会将所有请求代理到目标 URL。

打开 http://localhost:8080/__admin/recorder(假设您在默认端口 8080 上启动了 WireMock(,在该屏幕上您必须输入目标 URL 并单击"记录"按钮。在您停止录制之前,它将使此 Wiremock 充当代理。

如果录制不是您实际需要的内容,则可以关闭记录的存根映射。虽然这有点滥用记录器功能,但这是一种快速简便的方法,可以将您的 Wiremock 临时转换为代理,而不是使用存根响应。

Wiremock可以根据它运行的场景状态来选择要使用的灯具。在不同的状态下,即使对于相同的请求,它也可以具有不同的映射,因此以不同的方式运行(在其中一个状态可以从夹具响应,而在另一个状态中,它可以转发到真正的API(。

假设存在当前处于默认"已启动"状态的代理方案,则所有查询都将由不特定于任何方案状态的存根提供服务。

但是,如果代理方案处于活动状态,并且我们有一个特定于该方案状态的映射(必需的场景状态属性(,并且它的优先级高于默认值,则将针对到此 Wiremock 实例的任何 URI 执行此映射:

{
"scenarioName": "Proxy",
"requiredScenarioState": "Activated",
"priority": 2,
"request": {
"urlPattern": ".*"
},
"response": {
"proxyBaseUrl": "https://swapi.dev/api"
}
}

当此映射匹配时,response.proxyBaseUrl的值将使所有请求转发到提供的主机。

现在我们需要能够将代理方案切换为激活状态并返回, 所以我们在这个 Wiremock 上为POST /proxy端点定义了另外两个映射。它们将具有更高的优先级- 1,因此它们甚至可以覆盖"urlPattern": ".*"映射。

将包含所有三个映射的 JSON 文件拖放到您的wiremock/mappings

{
"mappings": [
{
"scenarioName": "Proxy",
"requiredScenarioState": "Activated",
"priority": 2,
"request": {
"urlPattern": ".*"
},
"response": {
"proxyBaseUrl": "https://swapi.dev/api"
}
},
{
"priority": 1,
"scenarioName": "Proxy",
"requiredScenarioState": "Activated",
"newScenarioState": "Started",
"request": { "method": "POST", "url": "/proxy"},
"response": { "status": 201, "body": "Proxy De-activated (Stubs will be used)" }
},
{
"priority": 1,
"scenarioName": "Proxy",
"requiredScenarioState": "Started",
"newScenarioState": "Activated",
"request": { "method": "POST", "url": "/proxy" },
"response": { "status": 201, "body": "Proxy Activated (Will forward all requests)" }
}
]
}

现在,您可以将代理方案切换到"已激活"状态, 并在将其切换回"已启动"状态后:

curl http://localhost:8080/proxy -XPOST

这种方法的好处是,只需进行最少的更改即可将此映射文件从一个项目复制到另一个项目。

最新更新