首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Mountebank中记录请求并使用代理进行响应?

如何在Mountebank中记录请求并使用代理进行响应?
EN

Stack Overflow用户
提问于 2016-04-18 22:04:10
回答 1查看 5.6K关注 0票数 3

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

代码语言:javascript
运行
复制
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的所有请求。

我的服务器现在的输出:

代码语言:javascript
运行
复制
mb
info: [mb:2525] mountebank v1.6.0-beta.1102 now taking orders - point your browser to http://localhost:2525 for help
info: [mb:2525] POST /imposters
info: [http:6568 proxyAlways] Open for business...
info: [http:6568 proxyAlways] ::ffff:127.0.0.1:55488 => GET /

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

还有谁能解释一下

将响应保存到代理响应前面的新存根中: (来自这个坐骑银行文件)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-18 23:52:04

如何存储代理结果

简单的回答是坐骑银行已经在储存它了。您可以通过查看curl http://localhost:2525/imposters/6568的输出来验证这一点。真正的问题是如何重放存储的响应?

挂载银行代理的常见使用场景是在mb的一个正在运行的实例上记录代理响应,保存结果,然后使用保存的响应启动mb的下一个实例。这样做的方法是让系统处于测试状态,对话来服务您正试图在需要的条件下通过挂载银行代理进行存根处理,然后通过向GETDELETE发送一个HTTP或DELETE来保存响应(及其请求谓词)。您可以通过REST将响应的JSON主体输入下一个mb实例,或者通过将其保存在磁盘上并使用类似于mb --configfile savedProxyResults.json的命令启动挂载库。在这一点上,mountebank对请求提供完全相同的响应,而不连接到下游服务。

代理创建新存根

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

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

代码语言:javascript
运行
复制
GET /test?q=elephants

methodGETpath/testqueryq=elephants。由于这是第一个请求,所以我们将其发送到下游服务器,该服务器返回的主体为:

代码语言:javascript
运行
复制
No results

不管您将挂载银行设置为哪种代理模式,这都是正确的,因为它必须至少向下游查询一次。现在假设,当我们考虑这个问题时,下游服务增加了一只大象,然后我们的被测试系统发出同样的呼叫:

代码语言:javascript
运行
复制
GET /test?q=elephants

如果我们处于proxyOnce模式,那么大象被添加到真正的服务并不重要,我们将继续返回保存的响应:

代码语言:javascript
运行
复制
No results

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

代码语言:javascript
运行
复制
"stubs": [
  {
    "predicates": [{
      "deepEquals': {
        "method": "GET",
        "path": "/test",
        "query": { "q": "elephants" }
      }
    }],
    "responses": [
      {
        "is": {
          "body": "No results"
        }
      }
    ]
  }
]

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

代码语言:javascript
运行
复制
1. Jumbo reporting for duty!

这一点很重要,因为如果我们关闭挂载银行进程并重新启动它,现在我们的测试可以依赖于这样一个事实:我们将遍历这两个响应:

代码语言:javascript
运行
复制
"stubs": [
  {
    "predicates": [{
      "deepEquals': {
        "method": "GET",
        "path": "/test",
        "query": { "q": "elephants" }
      }
    }],
    "responses": [
      {
        "is": {
          "body": "No results"
        }
      },
      {
        "is": {
          "body": "1. Jumbo reporting for duty!"
        }
      }
    ]
  }
]
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36705088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档