【问题标题】:Wiremock variable substitution in JSON responseJSON响应中的Wiremock变量替换
【发布时间】:2016-03-29 15:48:54
【问题描述】:

我正在尝试配置 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 中可用。

【问题讨论】:

    标签: json jsonpath wiremock


    【解决方案1】:

    这似乎是OpenTable's 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"]
        }
    }
    

    【讨论】:

    • 这正是我最后的做法,谢谢!我不好没有更新问题。
    • 太棒了!
    【解决方案2】:

    除非您添加了未提及的扩展,否则这是行不通的 - JSON API 中没有“捕获”元素,并且无法(没有扩展)在响应中进行变量替换。

    【讨论】:

    • 嗨,汤姆,首先,感谢您的出色模拟!你是对的,我检查并发现我们确实有捕获的扩展,我会从中挖掘。是否有用于wiremock 的完整JSON API?我很难在 Internet 上找到有关它的大量信息。
    • 没有一个文档涵盖整个 JSON API,但它在整个wiremock.org 中都涵盖了。你有什么具体的要求吗?
    【解决方案3】:

    WireMock.Net 现在确实支持这个。

    发送请求时,例如:

    {
        "username": "stef"
    }
    

    并使用 ma​​pping 像:

    {
      "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 项目上创建一个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 2011-08-09
      相关资源
      最近更新 更多