当前位置: 首页 > 知识库问答 >
问题:

JSON响应中的Wiremock变量替换

诸葛乐逸
2023-03-14

我正在尝试配置Wiremock映射,以从请求中返回一个带有值的JSON响应。

请求很简单

{ "clientTag": "123" }

它的映射是:

{
  "priority": 4,
  "request": {
    "method": "POST",
    "urlPattern": "/test"
  },
  "response": {
    "status": 200,
    "body": "{ \"loginId\": \"${loginId}\" }",
    "headers": {
      "Content-Type": "application/json"
    }
  },
  "captures" : [ {
            "source" : "BODY",
            "target" : "loginId",
            "pattern" : "$..clientTag",
            "captureGroup" : 1
  } ]
}

我收到回复:

{ "loginId": "" }

而预期的是:

{ "loginId": "123" }

如果我切换到XML请求,模式一切正常

不幸的是,Wiremock文档很少,因此存在问题。有什么想法吗?

更新:如果有人稍后阅读本文,您最好在代码中使用转换,这些转换在后来的Wiremock版本中可用。


共有3个答案

楚嘉纳
2023-03-14

WireMock.Net现在确实支持这一点。

发送请求时,如:

{
    "username": "stef"
}

并使用如下映射:

{
  "Request": {
    "Path": {
      "Matchers": [
        {
          "Name": "WildcardMatcher",
          "Pattern": "/test"
        }
      ]
    },
    "Methods": [
      "post"
    ]
  },
  "Response": {
    "StatusCode": 200,
    "BodyAsJson": {
      "path": "{{request.path}}",
      "result": "{{JsonPath.SelectToken request.bodyAsJson \"username\"}}"
    },
    "UseTransformer": true,
    "Headers": {
      "Content-Type": "application/json"
    }
  }
}

人们的反应会是这样的:

{
    "path": "/test",
    "result": "stef"
}

请注意,此功能当前处于预览模式,请参阅 NuGet 包版本 1.0.4.8 预览版-01。

如果您有任何问题,只需在这个github项目上创建一个问题。

贡英华
2023-03-14

除非您添加了一个没有提到的扩展,否则这是行不通的JSON API中没有“captures”元素,也没有办法(没有扩展)在响应中进行变量替换。

宰修能
2023-03-14

这似乎是OpenTable的Wiremock Body Transform的完美用例。

它可以很容易地与独立服务器集成,如下所示:

java-cp“wiremock-body-transformer-1.1.6.jar:wiremock-2.3.1-standalone.jar”com.github.tomakehurst.wiremock.standalone。WireMockServerRunner--verbose--extensions com.opentable.extension.BodyTransformer

此扩展允许您在请求中轻松指定要在响应中匹配的变量。

{
    "request": {
        "method": "POST",
        "urlPath": "/transform",
        "bodyPatterns": [
            {
                "matchesJsonPath": "$.name"
            }
        ]
    },
    "response": {
        "status": 200,
        "body": "{\"responseName\": \"$(name)\"}",
        "headers": {
            "Content-Type": "application/json"
        },
        "transformers": ["body-transformer"]
    }
}

它还可以轻松地让您在响应中生成一个随机整数,如下所示:

{
    "request": {
        "method": "POST",
        "urlPath": "/transform",
    },
    "response": {
        "status": 200,
        "body": "{\"randomInteger\": \"$(!RandomInteger)\"}",
        "headers": {
            "Content-Type": "application/json"
        },
        "transformers": ["body-transformer"]
    }
}

 类似资料:
  • 我有一个问题,我已经在stackoverflow上问了几次,我已经尝试了所有这些问题,没有一个有效。所以我很想在另一个时间总结这个问题,并试着更准确地描述它。 我正在构建一个应用程序,将图片发送到python后端,以获得xcode swift中的图像识别结果。 我正在使用Alamofire上传,这里是上传部分: 下面是我从服务器端得到的json响应: 所以,我想要达到的目的,就是打印第一个预言的名

  • 我在使用WireMock时遇到了一个问题,我已经扩展了< code>ResponseTransformer并实现了所有需要的方法,如下所示: 现在我想将这个特定的变压器应用于我写的存根之一,存根如下所示: 当我启动服务并执行后调用时,我确实看到应用了转换器,但响应实际上并没有被转换。在启动服务时,我也尝试在config部分应用transformer,但这无济于事。 因此,我的问题是,我应该如何正确

  • 我们想在json响应中添加一些变量,但是内部方面。 我们有以下方面: 我们需要做一些类似于在这个函数中所做的事情,但不是请求,而是响应。 我们想要注入方面的方法是:

  • 是否可以使用线雾模拟Jmeter中API的json响应。如果是,请您分享一步一步的过程。

  • 我有一个Wiremock服务器的独立实例。映射作为json文件存储在mappings文件夹下。我有一个POST请求,需要在响应中返回一个动态ID(整数)。有没有办法在json文件中进行配置?

  • 我想使用具有大量数据的HTTP客户端来测试我们的应用程序。是否可以使用 WireMock 创建无限或几千兆字节长度的输出,而无需分配具有该大小的字节数组或字符串? 据我所知有三个的方法: 我已经尝试但我得到了以下异常: 另外两个需要一个巨大的内存数组或字符串,这也是我想要避免的。 我还检查了枚举,但它似乎不可扩展。