如何在Mountebank中使用代理记录请求和响应?

2024-05-15 01:29:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Mountebank创建一个冒名顶替进程,并希望记录请求和响应。为了创建一个httpimposter,我使用了下面的CURL命令,如他们的文档中所述。在

curl -i -X POST -H 'Content-Type: application/json' http://127.0.0.1:2525/imposters --data '{
  "port": 6568,
  "protocol": "http",
  "name": "proxyAlways",
  "stubs": [
    {
      "responses": [
        {
          "proxy": {
            "to": "http://localhost:8000",
            "mode": "proxyAlways",
            "predicateGenerators": [
              {
                "matches": {
                  "method": true,
                  "path": true,
                  "query": true
                }
              }
            ]
          }
        }
      ]
    }
  ]
}'

我有另一个服务器在http://localhost:8000上运行,它正在监听所有到达端口6568的请求。在

我的服务器现在的输出:

^{pr2}$

我想把所有的请求和响应都记录下来,但现在无法做到。当我输入curl -i -X GET -H 'Content-Type: application/json' http://127.0.0.1:6568/时,它会给我一个响应,但是我如何存储它呢?在

还有谁能给我解释一下

save off the response in a new stub in front of the proxy response:

(from this Mountebank documentation)


Tags: thein服务器jsontruelocalhosthttpapplication
1条回答
网友
1楼 · 发布于 2024-05-15 01:29:32

如何存储代理结果

简而言之,mountebank已经在存储它了。您可以通过查看curl http://localhost:2525/imposters/6568的输出来验证这一点。真正的问题是如何重放存储的响应?在

mountebank代理的常见用法是在mb的一个运行实例上记录代理响应,保存结果,然后使用这些保存的响应启动mb的下一个实例。这样做的方法是让测试中的系统在任何需要的情况下通过mountebank代理与您尝试断开的服务进行对话,然后通过发送HTTP GETDELETEhttp://localhost:2525/imposters/6568?removeProxies=true&replayable=true来保存响应(及其请求谓词)。您可以通过restapi将该响应的JSON主体输入下一个mb实例,或者将其保存在磁盘上,然后使用类似mb configfile savedProxyResults.json的命令启动mountebank。此时,mountebank将在不连接下游服务的情况下对请求提供完全相同的响应。在

代理创建新存根

最后一个问题围绕着理解proxyAlways模式是如何工作的。默认的proxyOnce模式意味着mountebank代理第一次看到唯一满足谓词的请求时,它将查询下游服务并保存响应。下一次当请求似乎满足完全相同的谓词时,它将避免下游调用,只返回保存的结果。它只代理下游一次请求。另一方面,proxyAlways模式总是向下游发送请求,并保存同一请求的响应列表。在

为了说明这一点,在您复制的示例中,我们关心请求的methodpath和{}字段,因此,如果我们看到两个请求具有完全相同的这三个字段组合,我们需要知道是应该将保存的响应发送回还是继续代理。假设我们第一次发送:

GET /test?q=elephants

methodGETpath是{},而{}是{}。由于这是第一个请求,我们将其发送到下游服务器,后者返回一个主体:

^{pr2}$

无论您将mountebank设置为哪个代理模式,这都是正确的,因为它必须至少查询下游一次。现在假设,在我们考虑的时候,下游服务添加了一个大象,然后我们正在测试的系统发出相同的调用:

GET /test?q=elephants

如果我们处于proxyOnce模式,大象被添加到实际服务中这一事实并不重要,我们将继续返回保存的响应:

^{pr2}$

如果您关闭mountebank进程并按上面所述重新启动它,您会看到相同的行为。在您保存的配置文件中,您会看到如下内容(简化一下):

"stubs": [
  {
    "predicates": [{
      "deepEquals': {
        "method": "GET",
        "path": "/test",
        "query": { "q": "elephants" }
      }
    }],
    "responses": [
      {
        "is": {
          "body": "No results"
        }
      }
    ]
  }
]

只有一个存根。另一方面,如果我们使用proxyAlways,那么对GET /test?q=elephants的第二次调用将生成新的大象:

1. Jumbo reporting for duty!

这一点很重要,因为如果我们关闭mountebank进程并重新启动它,那么现在我们的测试可以依赖于这样一个事实:我们将循环使用这两个响应:

"stubs": [
  {
    "predicates": [{
      "deepEquals': {
        "method": "GET",
        "path": "/test",
        "query": { "q": "elephants" }
      }
    }],
    "responses": [
      {
        "is": {
          "body": "No results"
        }
      },
      {
        "is": {
          "body": "1. Jumbo reporting for duty!"
        }
      }
    ]
  }
]

相关问题 更多 >

    热门问题