Sé que enviar un cuerpo con una solicitud GET no es la mejor idea, pero estoy tratando de consumir una API existente que lo requiere.
Enviar un cuerpo con POST es sencillo:
webClient.post() .uri("/employees") .body(Mono.just(empl), Employee.class) .retrieve() .bodyToMono(Employee.class); Sin embargo, no funcionará con webClient.get() , porque mientras que el método post() devuelve WebClient.RequestBodyUriSpec , el método get() devuelve WebClient.RequestHeadersUriSpec<?> , que no parece permitir ninguna definición de cuerpo.
Encontré una solución para Spring RestTemplate aquí: RestTemplate get with body , pero no tuve suerte para encontrar ninguna para el nuevo WebClient.
Una solicitud GET no tiene cuerpo. Está prohibido (bueno, no está prohibido, pero no se usa en absoluto) por la especificación HTTP. Tienes dos enfoques aquí:
Por supuesto, puede adjuntar los campos necesarios y pasar una carga útil a la solicitud GET, pero probablemente será ignorada o, peor aún, identificada como un error y rechazada por el servidor, antes de que su código servido tenga acceso a ella. Pero si está pasando datos al servidor para hacer algún procesamiento con ellos, entonces POST es lo que necesita usar.
Extraído de RFC-7231. HTTP 1.1. Semántica y código:
Una carga útil dentro de un mensaje de solicitud GET no tiene una semántica definida; enviar un cuerpo de carga útil en una solicitud GET puede hacer que algunas implementaciones existentes rechacen la solicitud.
(el marcado es mío)
Las razones para esto son, principalmente, que un método GET debe ser idempotente, produciendo la misma salida para la misma URL, si se repite. POST no tiene estos requisitos, por lo que POST es tu amigo.
Me encontré en una situación similar y, si bien las otras respuestas son correctas, no debe usar un cuerpo con una solicitud GET que no es útil cuando no posee o no puede cambiar el método ya existente al que está llamando.
El problema es que WebClient#get devuelve un WebClient.RequestHeadersUriSpec que no nos proporciona una forma de configurar el cuerpo. 1
WebClient#post devuelve un WebClient.RequestBodyUriSpec que nos brinda una forma de configurar el cuerpo, pero nos hará usar el método HTTP incorrecto, POST en lugar de GET.
Afortunadamente para nosotros atrapados en esta situación, hay WebClient#method que devuelve un WebClient.RequestBodyUriSpec y nos permite configurar el método HTTP.
webClient.method(HttpMethod.GET) .uri("/employees") .body(Mono.just(empl), Employee.class) .retrieve() .bodyToMono(Employee.class);Sin embargo, aún puede tener problemas en sus bibliotecas de prueba ...