Я работаю с двумя микросервисами, используя Контракт Spring Cloud. Один предоставляет свой контракт, а другой его потребляет. В одном сценарии ответ поставщика совпадает с запросом.
Итак, контракт с провайдером выглядит так:
Contract.make {
request {
method 'POST'
url '/provider/foo'
body(
"foo": $(regex("[a-zA-Z0-9]{20}"))
)
}
response {
status 200
body(
"fooResponse": fromRequest().body("\$.foo")
)
}
И сгенерированное отображение макета:
{
"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"
}
Может быть, не поддерживается получение из запроса значения регулярного выражения?
Я думаю, что отображение должно содержать request.body
вместо this
. Также мне интересно, нужно ли вам использовать {
3 раза или только 2 раза. Или вам нужно убежать от них?
Возможное отображение:
"response" : {
"status" : 200,
"body" : "{\"fooResponse\":\"{{jsonpath request.body '$.foo'}}\"}",
"transformers" : [ "response-template" ]
},
См. Также главу JSONPath helper
на http://wiremock.org/docs/response-templating
Однажды у меня была такая же проблема. Вы можете попробовать использовать value()
так:
"fooResponse": value(fromRequest().body('$.foo'))
Сопоставления автоматически генерируются из контрактов.