我正在尝试配置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版本中可用。
答案 0 :(得分:2)
这似乎是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"]
}
}
答案 1 :(得分:1)
除非您已经添加了一个您尚未提及的扩展程序,否则这无法正常工作 - 没有&#34;捕获&#34; JSON API中的元素,没有办法(没有扩展)在响应中进行变量替换。
答案 2 :(得分:1)
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项目上创建一个问题。