Backend 要怎麼知道使用者什麼時候傳送了新訊息?一直主動詢問「有沒有新訊息?」,不僅會產生很多沒有必要的 Request,也無法在事件發生時立即收到資料,所以該怎麽辦呢?
是一種「事件驅動」的通訊方式,當某個特定事件發生時,來源系統會主動將事件相關的資料發送到事先設定好的 Webhook URL。這樣就不需要進入低效的反覆查詢模式,我們可以用門鈴來理解它。當門鈴響起時,我們就會知道有人來訪,而不需要每隔幾秒自己去開門確認有沒有人。Webhook 就像這樣,等到 Event 發生後,再主動通知接收端,這樣就不需要一直透過 Polling 反覆查詢是否有新的資料。
-事件觸發 (Event Trigger):
來源系統發生了特定事件。例如:新增一筆睡眠紀錄、送出表單或是在線上完成付款。
-封裝資料 (Payload):
來源系統將該事件的相關資訊打包。通常為 JSON 格式,包含日期、睡眠時數、睡眠品質等資料。
-發送請求 (HTTP POST):
來源系統透過 HTTP POST 方法,將打包好的資料發送到預先設定好的 Webhook URL,這個 URL 就像是來源系統的寄送地。
-接收與執行 (Action):
後端程式或是其他自動化工具收到請求後,就可以解析 Payload,再根據內容執行後續動作。例如儲存新的睡眠紀錄,或重新進行睡眠資料分析。
他們兩個都是透過 HTTP Request 傳送資料,差別在於主動發起 Request的對象不同。如果透過 API 不斷詢問外部服務有沒有新的資料,這種方式稱為 Polling(輪詢);Webhook 則是在 Event 發生後,由來源系統主動將資料送到指定的 Endpoint。
可以透過下列表格理解:
了解基本概念後,嘗試在原本的 Java HttpServer 中新增一個 /webhook,來模擬接收外部服務傳來的 Event。先建立新的 Endpoint,這樣當 Request 傳送到該 URL 時,Server 就會交給 WebhookHandler 處理。
接著在 WebhookHandler 中取得 Request Body,確認 Backend 是否真的有接收到 Payload。
從網頁上模擬外部服務向 /webhook 發送一個 POST Request。
檢測成功:
可以看到 Request 成功取得 200 OK,代表 Java Server 已經收到並處理這次傳到 /webhook 的 Request。
回到 Java Console 後,也可以看到 Request Body 中的內容被成功讀取。