JSON 响应中的 Wiremock 变量替换
Wiremock variable substitution in JSON response
我正在尝试将 Wiremock 映射配置为 return 具有来自请求的值的 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 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 项目上创建一个问题。
这似乎是 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"]
}
}
我正在尝试将 Wiremock 映射配置为 return 具有来自请求的值的 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 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 项目上创建一个问题。
这似乎是 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"]
}
}