Поставщик контрактов spring cloud возвращает то же, что и запрос

Я работаю с двумя микросервисами, используя Контракт 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"
}

Может быть, не поддерживается получение из запроса значения регулярного выражения?

0
0
196
2

Ответы 2

Я думаю, что отображение должно содержать 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

Сопоставления автоматически генерируются из контрактов.

Mr.Joe 11.09.2018 15:44

Однажды у меня была такая же проблема. Вы можете попробовать использовать value() так:

"fooResponse": value(fromRequest().body('$.foo'))

Другие вопросы по теме