繁体   English   中英

JSON响应中的Wiremock变量替换

[英]Wiremock variable substitution in JSON response

我正在尝试配置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请求,则所有模式<clientTag>(.*?)</clientTag>都可以正常工作,但是我想坚持使用JSON。

不幸的是,Wiremock文档很少,因此是一个问题。 有任何想法吗?

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

对于OpenTable的Wiremock Body Transformer来说,这似乎是一个完美的用例。

可以像下面这样轻松地将其与独立服务器集成:

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"]
    }
}

除非您添加了未提及的扩展名,否则它将无法正常工作-JSON API中没有“ captures”元素,也没有办法(没有扩展名)在响应中进行变量替换。

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-preview-01。

如果您有任何疑问,请在此github项目上创建一个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM