为啥 WireMock 说请求不匹配?春天云合约
Posted
技术标签:
【中文标题】为啥 WireMock 说请求不匹配?春天云合约【英文标题】:Why WireMock says that the Request not matches? Spring cloud contract为什么 WireMock 说请求不匹配?春天云合约 【发布时间】:2017-12-28 09:19:09 【问题描述】:Wiremock 记录以下请求不匹配:
WireMock : Request was not matched:
"url" : "/api/accounts?username=defaultuser",
"absoluteUrl" : "http://localhost:11651/api/accounts?username=defaultuser",
"method" : "GET",
"clientIp" : "127.0.0.1",
"headers" :
"authorization" : "bearer test123",
"accept" : "application/json, application/*+json",
"user-agent" : "Java/1.8.0_121",
"host" : "localhost:11651",
"connection" : "keep-alive"
,
"cookies" : ,
"browserProxyRequest" : false,
"loggedDate" : 1500711718016,
"bodyAsBase64" : "",
"body" : "",
"loggedDateString" : "2017-07-22T08:21:58Z"
Closest match:
"urlPath" : "/api/accounts",
"method" : "GET",
"headers" :
"authorization" :
"matches" : "^bearer"
,
"accept" :
"equalTo" : "application/json, application/*+json"
,
"user-agent" :
"equalTo" : "Java/1.8.0_121"
,
"host" :
"matches" : "^localhost:[0-9]5"
,
"connection" :
"equalTo" : "keep-alive"
,
"queryParameters" :
"username" :
"matches" : "^[a-zA-Z0-9]*$"
问题是因为url和urlPath的不同吗? 我还尝试在合同中指定 absoluteUrl。但它被忽略了。我猜是因为它没有在合同 DSL 中定义。
合约的请求方如下所示:
request
method 'GET'
url('/api/accounts')
queryParameters
parameter('username', $(consumer(regex('^[a-zA-Z0-9]*$')), producer('defaultuser')))
headers
header('authorization', $(consumer(regex('^bearer')), producer(execute('authClientBearer()'))))
header('accept', $(consumer('application/json, application/*+json')))
header('user-agent', $(consumer('Java/1.8.0_121')))
header('host', $(consumer(regex('^localhost:[0-9]5'))))
header('connection', $(consumer('keep-alive')))
【问题讨论】:
我认为您匹配的授权标头是错误的。你应该用它来结束它。* 我改了。但仍然不匹配。 在发送的请求中尝试在查询参数前添加/。如果这不起作用,您可以按顺序更改合同并监控不匹配的内容。换句话说,做一个简单的获取 URL,然后添加查询参数和标题。 我会试试的。我还有第二份合同,其网址相同,但带有电子邮件查询参数。 WireMock 是否有可能仅根据 url 做出决定?因此,如果我有两个具有相同 url 但查询参数不同的合同,则无法选择正确的合同? 不,我不这么认为。它在 url 的末尾敲响了关于丢失 / 的铃声 【参考方案1】:原来是合同/存根中的URL末尾缺少/
【讨论】:
【参考方案2】:与问题没有直接关系,但适用于所有来自 Google 的人:
在我的情况下,我处于错误的场景状态。
更多关于场景状态的信息:http://wiremock.org/docs/stateful-behaviour/
【讨论】:
以上是关于为啥 WireMock 说请求不匹配?春天云合约的主要内容,如果未能解决你的问题,请参考以下文章
如何根据使用wiremock和JSON的请求正文匹配获得响应
正则表达式.+可以匹配空格,但是[.\w]+却不匹配,为啥?