Estoy intentando realizar una solicitud GET a una aplicación en Kubernetes (GKE), pero siempre devuelve 400 solicitudes incorrectas.
Los métodos POST, PUT y DELETE funcionan perfectamente.
Y lo más extraño es que cuando uso el reenvío de puertos directamente al pod, no tengo problemas con la solicitud GET.
He intentado minimizar el código de mi aplicación tanto como sea posible y se ve así:
const express = require('express') const app = express() const port = 3000 app.use(express.json()) app.use(express.urlencoded({ extended: true })) app.get('/', (req, res) => { res.send(req.body) }) app.post('/', function(req, res){ res.send(req.body); }); app.put('/', function(req, res){ res.send(req.body); }); app.delete('/', function(req, res){ res.send(req.body); }); app.listen(port, () => { console.log(`Listening to port ${port}`) })Creo que el problema está en mi configuración de Ingress porque con port-forward funciona bien. Aquí está mi entrada yaml:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: test-ingress spec: tls: - hosts: - my-test-host secretName: tls-secret rules: - host: my-test-host http: paths: - path: /* backend: serviceName: my-test-service servicePort: 3000Finalmente, esta es la solicitud que siempre devuelve 400.
curl --location --request GET 'https://my-test-host/' \ --header 'Content-Type: application/json' \ --data-raw '{ "test": "123" }'La misma solicitud con otros métodos (POST, PUT o DELETE) funciona bien. Por favor, ¿qué estoy haciendo mal?
Logré encontrar la solución al problema.
El problema es que Ingress no acepta solicitudes HTTP GET con cuerpo y responde con el error 400.
Lo más triste es que no encontré nada sobre este problema en la documentación de Kubernetes en ninguna parte.
Busqué información de buenas prácticas sobre el envío de cuerpos en solicitudes GET y luego encontré estos dos enlaces:
https://www.rfc-editor.org/rfc/rfc7231#section-4.3.1
https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET
Según tengo entendido, no está prohibido enviar el GET con el cuerpo, pero no se recomienda.
Entonces, para resolver mi problema, cambié mi código para obtener parámetros de "consulta" en lugar de "cuerpo" en la solicitud GET:
app.get('/', (req, res) => { res.send(req.query) })En consecuencia, necesitaba cambiar los parámetros de envío en mi solicitud GET:
curl --location --request GET 'https://my-test-host?test=123'Lección aprendida: para evitar problemas, nunca acepte solicitudes GET con cuerpo.
Gracias.