为什么这个对入口(GKE)的HTTP GET请求总是返回400(坏请求)错误



我试图向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请求。

谢谢。

相关内容

  • 没有找到相关文章

最新更新