Wiremock 响应取决于请求正文参数
Wiremock response depending on request body parameter
我正在向 Wiremock(独立版,2.21)发送请求正文
{
"attribute1": "value1",
"attribute2": "value2",
...
"attributen": "valuen"
}
到URL/test/test-url
,没有查询参数,有POST
。
我希望它执行以下操作:
- 当 attribute1 等于 "text1"
时响应 "response1.json"
- 当 attribute1 等于 "text2"
时响应 "response2.json"
- 当 attribute1 等于 "text1" 或 "text2"
以外的值时,用 "response_general.json" 响应
其他属性与答案无关。
我想只使用 .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')]"
}
]
我正在向 Wiremock(独立版,2.21)发送请求正文
{
"attribute1": "value1",
"attribute2": "value2",
...
"attributen": "valuen"
}
到URL/test/test-url
,没有查询参数,有POST
。
我希望它执行以下操作:
- 当 attribute1 等于 "text1" 时响应 "response1.json"
- 当 attribute1 等于 "text2" 时响应 "response2.json"
- 当 attribute1 等于 "text1" 或 "text2" 以外的值时,用 "response_general.json" 响应
其他属性与答案无关。 我想只使用 .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')]"
}
]