[英]Why this HTTP GET request to the Ingress (GKE) is always returning 400 (bad request) error?
我正在嘗試向 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 配置中,因為使用端口轉發它運行良好。 這是我的入口 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://tools.ietf.org/html/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'
經驗教訓:為避免出現問題,切勿接受帶有正文的 GET 請求。
謝謝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.