Groovy DSL Spring 云合同抛出 java.lang.IllegalStateException 用于具有 Unicode 字符的查询参数
Groovy DSL Spring cloud contract throwing java.lang.IllegalStateException for query parameter having Unicode Characters
我创建了一个 groovy DSL 合同,如下所示
import org.springframework.cloud.contract.spec.Contract
Contract.make {
final def NAME_REGEX = '[A-Za-z0-9\u00C0-\u00FF\'\- ]{1,70}'
request {
method 'GET'
url('/api/getEmployess') {
queryParameters {
parameter 'name': $(c(regex(NAME_REGEX)), p('\u00CAdward J\u00F5hnson'))
}
}
headers {
contentType("application/json;charset=UTF-8")
}
}
response {
status OK()
body([
[
id : $(p(regex(nonBlank())), c('5a0eaf2012a9a12f1c98947a')),
name : fromRequest().query("name")
]
])
headers { contentType("application/json;charset=UTF-8") }
}
}
我的服务实现 returns 'name' 和 'id' 响应。作为响应,'name' 是 Unicode 值“Êdward Jõhnson”,与请求参数值不匹配。
我遇到以下错误 -
Parsed JSON [[{"id":"5a0eaf2012a9a12f1c98947a","name":"Êdward Jõhnson"}]] doesn't match the JSON path [$[*][?(@.['name'] == 'Êdward Jõhnson')]]
java.lang.IllegalStateException: Parsed JSON [[{"id":"5a0eaf2012a9a12f1c98947a","name":"Êdward Jõhnson" }]] doesn't match the JSON path [$[*][?(@.['name'] == 'Êdward Jõhnson')]]
at com.toomuchcoding.jsonassert.JsonAsserter.check(JsonAsserter.java:228)
at com.toomuchcoding.jsonassert.JsonAsserter.checkBufferedJsonPathString(JsonAsserter.java:267)
我尝试在 'name' 请求查询参数 -
中以两种方式传递 Unicode 值
- 将 Unicode 字符作为 Unicode 数字,如上例所示 -
参数 'name': $(c(regex(NAME_REGEX)), p('\u00CAdward J\u00F5hnson'))
- 按原样放置 Unicode 字符
参数 'name': $(c(regex(NAME_REGEX)), p('Êdward Jõhnson'))
但是对于这两种情况,我都遇到了同样的错误。看起来有些编码问题,因为我的值 Êdward Jõhnson 已更改为 àdward Jõhnson,如错误所述。
请帮我解决这个问题。
我找到了解决方法。作为响应 'name' 现场制作人,我输入了与请求 'name' 现场制作人相同的值。由于 groovy 对 unicode 值应用了不同的编码,因此失败。这只是解决问题的一种解决方法,而不是正确的最终解决方案。
import org.springframework.cloud.contract.spec.Contract
Contract.make {
final def NAME_REGEX = '^[A-Za-z0-9À-ÿ'\-\s]{1,70}$'
request {
method 'GET'
url('/api/getEmployess') {
queryParameters {
parameter 'name': $(c(regex(NAME_REGEX)), p('Êdward Jõhnson'))
}
}
headers {
contentType("application/json;charset=UTF-8")
}
}
response {
status OK()
body([
[
id : $(p(regex(nonBlank())), c('4b0eaf2012a9a12f1c98567c')),
name : $(p("Êdward Jõhnson"), c(fromRequest().body('$.name'))),
]
])
headers { contentType("application/json;charset=UTF-8") }
}
}
我创建了一个 groovy DSL 合同,如下所示
import org.springframework.cloud.contract.spec.Contract
Contract.make {
final def NAME_REGEX = '[A-Za-z0-9\u00C0-\u00FF\'\- ]{1,70}'
request {
method 'GET'
url('/api/getEmployess') {
queryParameters {
parameter 'name': $(c(regex(NAME_REGEX)), p('\u00CAdward J\u00F5hnson'))
}
}
headers {
contentType("application/json;charset=UTF-8")
}
}
response {
status OK()
body([
[
id : $(p(regex(nonBlank())), c('5a0eaf2012a9a12f1c98947a')),
name : fromRequest().query("name")
]
])
headers { contentType("application/json;charset=UTF-8") }
}
}
我的服务实现 returns 'name' 和 'id' 响应。作为响应,'name' 是 Unicode 值“Êdward Jõhnson”,与请求参数值不匹配。
我遇到以下错误 -
Parsed JSON [[{"id":"5a0eaf2012a9a12f1c98947a","name":"Êdward Jõhnson"}]] doesn't match the JSON path [$[*][?(@.['name'] == 'Êdward Jõhnson')]]
java.lang.IllegalStateException: Parsed JSON [[{"id":"5a0eaf2012a9a12f1c98947a","name":"Êdward Jõhnson" }]] doesn't match the JSON path [$[*][?(@.['name'] == 'Êdward Jõhnson')]]
at com.toomuchcoding.jsonassert.JsonAsserter.check(JsonAsserter.java:228)
at com.toomuchcoding.jsonassert.JsonAsserter.checkBufferedJsonPathString(JsonAsserter.java:267)
我尝试在 'name' 请求查询参数 -
中以两种方式传递 Unicode 值- 将 Unicode 字符作为 Unicode 数字,如上例所示 - 参数 'name': $(c(regex(NAME_REGEX)), p('\u00CAdward J\u00F5hnson'))
- 按原样放置 Unicode 字符 参数 'name': $(c(regex(NAME_REGEX)), p('Êdward Jõhnson'))
但是对于这两种情况,我都遇到了同样的错误。看起来有些编码问题,因为我的值 Êdward Jõhnson 已更改为 àdward Jõhnson,如错误所述。
请帮我解决这个问题。
我找到了解决方法。作为响应 'name' 现场制作人,我输入了与请求 'name' 现场制作人相同的值。由于 groovy 对 unicode 值应用了不同的编码,因此失败。这只是解决问题的一种解决方法,而不是正确的最终解决方案。
import org.springframework.cloud.contract.spec.Contract
Contract.make {
final def NAME_REGEX = '^[A-Za-z0-9À-ÿ'\-\s]{1,70}$'
request {
method 'GET'
url('/api/getEmployess') {
queryParameters {
parameter 'name': $(c(regex(NAME_REGEX)), p('Êdward Jõhnson'))
}
}
headers {
contentType("application/json;charset=UTF-8")
}
}
response {
status OK()
body([
[
id : $(p(regex(nonBlank())), c('4b0eaf2012a9a12f1c98567c')),
name : $(p("Êdward Jõhnson"), c(fromRequest().body('$.name'))),
]
])
headers { contentType("application/json;charset=UTF-8") }
}
}