Один из внешних API использует имена параметров запроса со специальными символами (не спрашивайте меня почему, я не знаю). Метод моего симулированного клиента для этого API объявлен так:
@GetMapping("/v1/user/{userId}/orders")
List<Order> getOrders(
@PathVariable("userId") String userId,
@RequestParam("page[number]") Integer pageNumber,
@RequestParam("page[size]") Integer pageSize);
Как я уже говорил, параметры запроса содержат специальные символы [
и ]
. Я использую Spock для тестирования и хочу настроить заглушку Wiremock следующим образом:
wiremock.stubFor(
get(urlPathMatching('/v1/users/' + userId + '/orders'))
.withQueryParam("page[number]", new EqualToPattern("1"))
.withQueryParam("page[size]", new AnythingPattern())
.willReturn(
status(200)
.withHeader("Content-type", "application/json")
.withBody("""[]""")
))
Но я получаю:
--------------------------------------------------------------------------------------------------
| Closest stub | Request |
--------------------------------------------------------------------------------------------------
|
GET | GET
/v1/users/123/orders | /v1/users/123/orders?page%5Bnumber%5D=%7Bpage%5Bnumber%5
| D%7D&page%5Bsize%5D=%7Bpage%5Bsize%5D%7D
|
Query: page[number] = 1 | <<<<< Query is not present
Query: page[size] [anything] (always) | <<<<< Query is not present
|
--------------------------------------------------------------------------------------------------
После множества проб и ошибок я пришелс решением использовать @PathVariable
s вместо @RequestParam
s в методе симулированного клиента:
@GetMapping("/v1/users/{userId}/orders?page[number]={pageNumber}&page[size]={pageSize}")
List<Order> getOrders(
@PathVariable("userId") String userId,
@PathVariable("pageNumber") Integer pageNumber,
@PathVariable("pageSize") Integer pageSize);
и кодировать все параметры запроса в Wiremock
wiremock.stubFor(
get(urlPathMatching('/v1/users/' + userId + '/orders'))
.withQueryParam("page%5Bnumber%5D", new EqualToPattern("1"))
.withQueryParam("page%5Bsize%5D", new AnythingPattern())
.willReturn(
status(200)
.withHeader("Content-type", "application/json")
.withBody("""[]""")
))
Тогда это работает. Но это похоже на взлом. Также проблематично использовать необязательные параметры запроса.
Есть ли способ использовать @RequestParam
s со специальными символами? Похоже, что это ошибка в Spring?
Тем временем я попытаюсь отладить ее, чтобы понять, в чем проблема.