我有一個 api,如果建筑物是開放的并且那里有多少豌豆,它會回傳。現在我希望我的 Discord Bot 在大樓打開時發送訊息。我怎么做?
如果 api 收到請求,則回應如下所示:
state: {
open: false/true
}
uj5u.com熱心網友回復:
清除術語可能會有所幫助:此背景關系中的“API”是服務器公開的端點及其請求/回應模式(您可以將其視為您發送和接收回的欄位)。現在,這在您的情況下不會改變:它是相同的端點和相同的欄位。改變的是價值。
現在,您可能正在向服務器所在的給定 URL 發出 HTTP 請求。在 HTTP 世界中,我們說我們正在請求一個資源。https://stackoverflow.com后面的資源就是這個網站的主頁。您呼叫的端點背后的資源是建筑物的狀態。這個資源會隨著時間的推移而變化,它可能隨時打開或關閉,人們進出。但在這種情況下,API 不會改變。
讓我們改寫您的問題,這樣可以更清楚:客戶端如何知道 HTTP 資源何時更改?如果您的服務器僅公開此端點以了解建筑物的狀態,那么答案是可悲的“它不能”。假設我關閉了建筑物,服務器以某種方式知道它,現在建筑物的狀態是{"open": false}. 但是服務器沒有任何機制告訴你的客戶端狀態改變了,服務器只是等待客戶端詢問狀態是什么,然后回傳。允許服務器在沒有客戶端請求的情況下向您的客戶端發送資料會增加您的架構的一些復雜性,盡管有好處(客戶端會盡快知道狀態更改),但在您的情況下,可能沒有必要。
一種替代方法是長輪詢,在長輪詢中,您的客戶端向服務器發出請求并且服務器沒有立即回應,它......等待。等待更新,例如建筑物狀態的變化。當發生更新時,它會發送回應。反過來,客戶再次請求!并等待服務器發送更新......實際上,客戶端會跟上服務器狀態。提到的長輪詢文章給出了一個很好的例子:https ://javascript.info/long-polling#regular-polling
一個警告是服務器還必須支持長輪詢。如果服務器只回傳資源的任何狀態,那么客戶端將一遍又一遍地接收相同的狀態。另一個有效的解決方案是客戶端每隔幾秒鐘就不斷地請求服務器,而不是等待更新。您可能會錯過一些更新!但在某些情況下,忘記一些更新也沒關系。
好的,足夠的理論。你的情況呢?如果您想知道一扇門是打開還是關閉,但不關心它何時發生,您可以每五秒左右請求一次服務器:
在一些偽 javascript 代碼中,非常受前面提到的長輪詢文章的啟發:
async function subscribe() {
let buildingState = null
while (true) {
const response = await fetch("/subscribe")
if (response.status != 200) {
// An error - let's show it
showMessage(response.statusText)
}
// Get and show the message
const message = await response.json()
// a function that returns true/false if the state is different
if (stateChanged(message, buildingState)) {
updateDiscordBot(message)
buildingState = message
}
// wait five seconds and repeat
await new Promise(resolve => setTimeout(resolve, 5000));
}
}
subscribe();
這作業正常。但是,如果您想讓您的客戶端立即知道門何時打開或關閉,這還不夠:打開和關閉門是一個相當快的動作,即使您每秒都請求服務器,您也可能會丟失更新。在這種情況下,服務器需要更改。通過實作長輪詢或websockets之類的東西……您沒有提到服務器在您的控制之下,但如果沒有,與維護它的人討論以制定解決方案可能會有所幫助。
uj5u.com熱心網友回復:
如果您只有對該 API 的拉取訪問權限,那么檢測狀態更改的唯一方法是定期發送請求、存盤回應并在存盤的回應更改時觸發您的機器人。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/490784.html
標籤:javascript 节点.js api 网页API
