WebTestClient не может отправить тело в контроллер MVC

Javadoc RestTemplate рекомендует перейти на WebClient даже для традиционных (нереактивных) приложений. Поэтому логично, что я также хотел бы использовать WebTestClient в своих тестах контроллера, чтобы использовать согласованный API.

Это отлично работает, например, для запросов GET. Но когда я отправляю сообщение POST с телом, данные тела не поступают в контроллер. Почему нет?

Я могу протестировать свои контроллеры так:

WebTestClient webTestClient = WebTestClient.bindToController(TokenController()).build

webTestClient.post().uri("/post2")
    .accept(MediaType.APPLICATION_JSON)
    .contentType(MediaType.APPLICATION_FORM_URLENCODED)
    .bodyValue("grant_type=authorization_code")
    .exchange()
    .expectStatus().isOk()

Код контроллера:

@PostMapping(
    path = ["/post2"],
    consumes = [APPLICATION_FORM_URLENCODED_VALUE],
    produces = [APPLICATION_JSON_VALUE])
ResponseEntity<Any> post2(@RequestParam(GRANT_TYPE) String grantType) {
    System.out.println(grantType)
    return ResponseEntity.ok("{\"a\": 33}")
}

В этом примере grantType имеет значение null. Если я запускаю приложение и отправляю стандартный HTTP-запрос, то grantType, как и ожидалось, содержит значение «authorization_code».

(Я вручную перевел код с Kotlin на Java для этого вопроса, могут быть синтаксические ошибки)




Ответы (1)


Фактически вы вообще не разбираете тело в своем контроллере, вы ищете только параметр URL.

@RequestParam("grant_type") отобразит параметр, например / someUrl? Grant_type = something

Но вы отправляете данные в теле запроса, поэтому вам следует использовать

@ResponseBody String grantType вместо этого в вашем контроллере. Обратите внимание, что вводом будет вся строка grant_type = authorization_code.

person Øystein Øvrebø    schedule 30.06.2020