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 для этого вопроса, могут быть синтаксические ошибки)