我正在使用Spring Cloud Contract处理两个微服务。一个提供合同,另一个使用合同。在一种情况下,提供者的响应与请求相同。
所以提供者合同是这样的:
Contract.make {
request {
method 'POST'
url '/provider/foo'
body(
"foo": $(regex("[a-zA-Z0-9]{20}"))
)
}
response {
status 200
body(
"fooResponse": fromRequest().body("\$.foo")
)
}
以及生成的Wiremock映射:
{
"id" : "a80c0871-f4c0-49e3-8cc1-94de39899669",
"request" : {
"url" : "/provider/foo",
"method" : "POST",
"bodyPatterns" : [ {
"matchesJsonPath" : "$[?(@.['foo'] =~ /[a-zA-Z0-9]{20}/)]"
} ]
},
"response" : {
"status" : 200,
"body" : "{\"fooResponse\":\"{{{jsonpath this '$.foo'}}}\"}",
"transformers" : [ "response-template" ]
},
"uuid" : "a80c0871-f4c0-49e3-8cc1-94de39899669",
"scenarioName" : "scenarioReturnSameAsRequest",
"requiredScenarioState" : "Started"
}
但是当我的代码使用foo作为任何文本调用提供程序时,wiremock返回:
{
"fooResponse" : "{{{jsonpath this '$.foo'}}}"
}
我该如何建立一个与请求正文响应相同参数的合同?
修改
我尝试在响应中使用固定值,并且效果很好:
Contract.make {
request {
method 'POST'
url '/provider/foo'
body(
"foo": $(regex("[a-zA-Z0-9]{20}"))
)
}
response {
status 200
body(
"fooResponse": "fooValue"
)
}
现在的Wiremock返回:
{
"fooResponse" : "fooValue"
}
也许不支持从请求中获取正则表达式值?
答案 0 :(得分:0)
我认为映射应包含request.body
而不是this
。另外,我想知道您是否需要使用{
的3倍还是仅使用2次。还是您需要逃脱这些?
可能的映射:
"response" : {
"status" : 200,
"body" : "{\"fooResponse\":\"{{jsonpath request.body '$.foo'}}\"}",
"transformers" : [ "response-template" ]
},
另请参阅http://wiremock.org/docs/response-templating上的JSONPath helper
章节
答案 1 :(得分:0)
我曾经遇到过同样的问题。您可以尝试像这样使用value()
:
"fooResponse": value(fromRequest().body('$.foo'))