Wiremock 响应取决于请求正文参数

Wiremock response depending on request body parameter

我正在向 Wiremock(独立版,2.21)发送请求正文

{
        "attribute1": "value1",
        "attribute2": "value2",
        ...
        "attributen": "valuen"
}

到URL/test/test-url,没有查询参数,有POST。 我希望它执行以下操作:

其他属性与答案无关。 我想只使用 .json 文件来做到这一点。谢谢!

在较新版本的 WireMock (2.19+) 中,支持 HandleBars processing in the BodyFileName 属性。然后,这允许您在 JSON 请求正文中放置一个(部分)名称,然后将其值重新用于文件名引用。

{
  "request" : {
    "urlPathPattern" : "/jpathFile",
    "method" : "GET",
    "headers": {
        "Content-Type": {
            "equalTo": "application/json"
        }
    }

  },
  "response" : {
    "status" : 200,
    "headers": {
        "Content-Type": "application/json"
    },
    "bodyFileName" : "/{{jsonPath request.body '$.attribute2'}}",
    "transformers": ["response-template"]
  }
}

输入消息:

{
    "attribute1": "value1",
    "attribute2": "response.json",
    "attributen": "valuen"
}

response.json 位于 /__files/response.json 位置:

{
    "hello": "World!"
}

答案是检查 body 模式并针对 3 种不同情况进行 3 种映射:

一个用于检测到 text1 的情况:

       "request": {
          "method": "POST",
          "urlPattern":"/.*",
          "bodyPatterns": [
            {
              "contains":"\"attribute1\": \"text1\""
            }
          ]
        },
        "response": {
          "status": 200,
          "bodyFileName": "response_text1.json",
          "headers": {
            "Content-Type": "application/json"
          }
        }

一个用于检测到 text2 的情况:

      "request": {
          "method": "POST",
          "urlPattern":"/.*",
          "bodyPatterns": [
            {
              "contains":"\"attribute1\": \"text2\""
            }
          ]
        },
        "response": {
          "status": 200,
          "bodyFileName": "response_text2.json",
          "headers": {
            "Content-Type": "application/json"
          }
        }

两者都未检测到的情况。在这种情况下,会返回一个一般性的答案。

        "request": {
            "method": "POST",
            "urlPattern": "/.*"
        },
        "response": {
              "status": 200,
              "bodyFileName": "response_general.json",
              "headers": {
                "Content-Type": "application/json"
              }
            }

我建议使用 "matchesJsonPath"

而不是 "contains" 或 "equalTo"
"bodyPatterns": [
        {
            "matchesJsonPath": "$[?(@.attribute1 == 'value1')]"
        }
]