我试图向Kubernetes(GKE(中的应用程序发出GET请求,但总是返回400 Bad request。
POST、PUT和DELETE方法运行良好。
最奇怪的是,当我使用端口直接转发到pod时,我对GET请求没有问题。
我试着尽可能地减少我的应用程序的代码,它看起来像这样:
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}`)
})
我认为问题出在我的Ingress配置上,因为端口向前,它运行得很好。这是我的Ingress 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: 3000
最后,这是一个总是返回400的请求。
curl --location --request GET 'https://my-test-host/'
--header 'Content-Type: application/json'
--data-raw '{
"test": "123"
}'
使用其他方法(POST、PUT或DELETE(的相同请求运行良好。拜托,我做错了什么?
我设法找到了问题的解决方案。
问题是Ingress不接受正文为的HTTP GET请求,并返回错误400。
最可悲的是,我在任何地方的Kubernetes文档中都没有发现这个问题。
我搜索了关于在GET请求中发送正文的良好实践信息,然后找到了以下两个链接:
https://www.rfc-editor.org/rfc/rfc7231#section-4.3.1
https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET
据我所知,不禁止发送带有正文的GET,但不建议这样做。
所以,为了解决我的问题,我更改了代码,从";查询";取而代之的是";身体;在GET请求中:
app.get('/', (req, res) => {
res.send(req.query)
})
因此,我需要更改GET请求中的发送参数:
curl --location --request GET 'https://my-test-host?test=123'
经验教训:为了避免出现问题,永远不要接受带有body的GET请求。
谢谢。