Lo primero que hay que saber es que en peticiones HTTP (por ejemplo a una API REST), existe un parámetro que se puede mandar en la petición llamado body. Este parámetro en peticiones POST y PUT es muy común, pero en peticiones GET siempre ha sido un tema de controversia.

Aunque se recomienda que las APIs estén orientadas a recursos y que las peticiones GET sean para recuperar información, algunas personas consideran enviar datos complejos en el cuerpo de la petición GET debido a la limitación de tamaño del queryString en la URL.

Por ejemplo si miramos algunos especificaciones como la de OpenAPI, en su última versión no aconsejan el uso de body en peticiones GET. Otro ejemplo es la especificación RFC 7231 de HTTP/1.1 que indica que las peticiones GET no deberían tener body, y si lo tienen se debería ignorar.

Por tanto las especificaciones no recomiendan el uso de body, aunque no lo prohíben, va a depender de la implementación de cada librería si se permite su uso.

Por ejemplo en la API de ElasticSearch existe un endpoint GET /search para buscar, al que hay que mandar un body, y para soportar cualquier implementación lo que han hecho es crear otro endpoint POST /search (en principio no querían hacerlo para seguir la recomendación de API orientada a recursos y usar GET para solicitar información).

En el navegador

En el Frontend existen dos formas de mandar peticiones HTTP. Por un lado existe el la función de fetch, aunque su especificación indica que en caso de body en un GET se lanzar tirar error TypeError.

Extracto de la especificación de fetch: If either body exists and is non-null or inputBody is non-null, and request’s method is GET or HEAD, then throw a TypeError

En Javascript también existe la forma antigua, usando la función de XMLHttpRequest, pero igualmente su especificación no soporta incluir el body.

Extracto de la especificación de XMLHttpRequest: Initiates the request. The body argument provides the request body, if any, and is ignored if the request method is GET or HEAD. Throws an InvalidStateError DOMException if either state is not opened or the send flag is set

Por lo tanto desde un navegador no se va a poder hacer peticiones GET con body.

En node

En Node 🚧 existen varias librerías para hacer peticiones HTTP, una de las más conocidas es node-fetch, que intenta crear una sintaxis parecida a la función de fetch de navegador. El problema es que también sigue la especificación de fetch, por lo que si intentas mandar la petición GET con body saltará TypeError.

También existen otras librerías como axios, aunque no he probado si tienen esta limitación, habría que comprobar qué usa por debajo y si sigue alguna especificación.

Sin embargo, usando el módulo nativo http de Node o una librería que lo utilice, es posible enviar peticiones GET con body.