Специальные символы в имени @QueryParam в симметричном клиенте Spring - PullRequest
0 голосов
/ 14 октября 2019

Один из внешних 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?

Тем временем я попытаюсь отладить ее, чтобы понять, в чем проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...