無法使用 Webhook 發送 POST 請求

描述

我正在嘗試使用 Webhook widget 來連接到 Telegram。這是我的做法:


:warning: 重要:我實際上使用的是 ngrok URL,而不是 localhost!

但是,當我測試時,我收到以下錯誤:

{
"code": 404,
"message": "This webhook is not registered for GET requests. Did you mean to make a POST request?"
}

但是,當我使用 Telegram widget 來基本上做相同的事情時,我能夠連接,一切都完美運作。

在網上搜尋時,我看到有幾個人遇到了相同的問題,如下所示:Webhook interprets all sent requests as GET · Issue #12751 · n8n-io/n8n
我試圖遵循該主題的建議,但沒有成功。

問題

你知道我可能做錯了什麼嗎?有什麼可能的建議來避免此錯誤嗎?

你的 n8n 設置信息

  • **n8n 版本:v2
  • **資料庫(預設:SQLite):Sqlite
  • **n8n EXECUTIONS_PROCESS 設置(預設:own, main):main
  • **運行 n8n 方式(Docker、npm、n8n cloud、desktop app):docker
  • **作業系統:Linux Mint

@Federico_Gentile 那個 404 表示 GET 請求確實到達了節點,儘管它被設定為 POST,所以是有什麼東西改變了方法,而不是節點設定有問題。

ngrok 通常的兩個原因:

  1. 在瀏覽器中打開 URL 測試。位址欄總是發送 GET。POST 必須來自 curl/Postman 或 Telegram。
  2. 重新導向降級了方法。如果你呼叫 http:// ngrok URL(或點擊尾部斜線重新導向),301/302 到 https 會把你的 POST 轉變為 GET。直接使用 https ngrok URL,並設定 WEBHOOK_URL=https://your-ngrok-domain,這樣 n8n 會發出 https。

你是如何發送失敗的請求的:瀏覽器、curl 或 Telegram setWebhook?

非常感謝您的回覆。到目前為止,我一直是透過瀏覽器的搜尋欄來發送請求,所以那可能是原因所在。如果我想要正確地測試它,您會建議我使用什麼呢?

@Federico_Gentile 沒錯,就是這樣,搜尋列發送的是 GET 所以一定會觸發那個錯誤。

測試的話,發送一個真正的 POST。最快的方法是用 curl:

curl -X POST -H "Content-Type: application/json" -d '{"hello":"world"}' https://your-ngrok-domain/webhook-test/9390c7f6-894b-4948-9579-8d9ec556dc7b

測試 URL 有個要注意的地方:先點擊「Listen for test event」,它只會在主動監聽時捕捉單一請求。Postman 也可以,只要把方法設為 POST。

對於真正的 Telegram 設定,切換到 Production URL,啟用工作流程,然後將 Telegram 的 setWebhook 指向那個 https URL。Telegram 以 POST 方式發送更新,所以它的行為會和你的 Telegram Trigger 一樣。

發生此錯誤是因為 Telegram 正在嘗試使用 GET 請求存取你的 webhook URL,而你的 n8n Webhook 節點被設定為只接受 POST 請求。

檢查以下幾點:

  1. 確保你使用的是 n8n 的生產 URL(或在監聽時使用的活躍測試 URL),而不是直接在瀏覽器中開啟 URL。瀏覽器預設會發送 GET 請求。
  2. 驗證 Telegram webhook 已正確註冊:

https://api.telegram.org/bot<BOT_TOKEN>/setWebhook?url=<YOUR_NGROK_URL>/webhook/<path>
  1. 設定 webhook 後,使用以下方式檢查:

https://api.telegram.org/bot<BOT_TOKEN>/getWebhookInfo
  1. 在 n8n 中,如果使用測試 URL,請點擊**「監聽測試事件」**。測試 webhook 只在工作流程主動監聽時工作。
  2. 確認 Telegram Bot 觸發器/Webhook 路徑與在 n8n 中設定的路徑完全相符,並且 ngrok 正在將請求轉發到正確的 n8n 連接埠。
  3. 如果你手動在瀏覽器中造訪 webhook URL 並看到:

{
  "code": 404,
  "message": "This webhook is not registered for GET requests. Did you mean to make a POST request?"
}

這實際上是預期的行為,因為該端點只接受 POST 請求。

非常感謝 @achamm!這就是正確答案!

你很欢迎,我很乐意回答你的任何问题