Spring Cloud Contract供应商返回与请求相同的

时间:2018-09-10 09:07:50

标签: spring-cloud wiremock spring-cloud-contract

我正在使用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"
}

也许不支持从请求中获取正则表达式值?

2 个答案:

答案 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'))
相关问题