RestTemplate javado c рекомендует перейти на 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 для этого вопроса, возможно, синтаксические ошибки)