簡體   English   中英

為什么這個 HTTP 對 Ingress (GKE) 的 GET 請求總是返回 400(錯誤請求)錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM