2017-06-22 74 views
1

我目前正在對API進行一些更改,這裏的問題是我們要求來自另一個服務器的數據,但是要求服務器處理我們的請求並且爲了安全起見,我們首先要求他們提供AccessToken,如果令牌有效並且仍然活着(那些令牌持續2秒,我不知道如何正確使用英文,對不起),那麼一切都很好,如果令牌不好,我們不能要求他們提供任何東西。什麼是間隔提出請求的更優雅和有效的方式?

這裏的情況是,現在API發出請求而不先詢問令牌,並且如果當前令牌(因爲當API啓動時它要求令牌)無效,那麼它會捕獲錯誤並詢問爲一個新的令牌,然後再次提出請求。

我不喜歡它。我覺得如果我每兩秒鐘要求一個新的令牌而不是捕獲一個錯誤,它會更簡單和更清晰。

我怎樣才能做到這一點,但在一個優雅和有效的方式?現在我能想到的最基本的形式是每兩秒鐘用一個定時器將承諾放在自執行函數中。但我認爲這不是最好的辦法。有什麼建議麼?

+2

繼續每兩秒申請一個新令牌並不是一個好主意。它會給服務器帶來不必要的額外負擔,特別是如果大部分令牌都未使用。你應該創建一個變量:'var validToken'並且在接收到一個有效的標記後,將它設置爲'validToken = true'做一個'setTimeout'兩秒鐘並且將它設置爲'validToken = false'。如果'validToken == false',則在進行API調用之前要求新的令牌。 – Hoyen

+0

是的,我也會問這個,但我不得不出去吃午飯。 2秒到期時間是否真的有必要?例如,也許它應該是1或2分鐘,並且只有當您有待發送的請求時才應該檢索新的令牌。 – DragShot

+0

截止時間是由製作該API的人設定的,這不取決於我。 –

回答

-1

我的兩分錢在這裏:您可以跟蹤您的當前令牌被取回的時間,比方說,從UTC開始的毫秒數或系統啓動後的毫微秒數,以便您可以在發送之前根據其到期時間檢查它是否仍然有效一個要求。如果它已經過期,您只需在發送請求之前拉一個新的請求,從而保存一個請求/響應cicle。有關令牌的信息(例如此令牌到期之前的時間)可以與令牌本身一起提供,具體取決於傳輸協議或數據格式。它可以在單個線程(或其中的一組線程)中處理,並且只有在需要時纔會獲得新的令牌,從而爲客戶端和服務器節省帶寬。

希望這可以幫助你。

+0

你如何處理所有的轉移時間?您仍然需要保持代碼以前的每一個邊緣,因爲您正在處理第三方服務器,所以有DNS查找和網絡路由。如果你及時發送了請求,但是你遲到了2ms,到他們開始真正檢查你的令牌爲止?如果它位於Redis緩存中,並且它們自動失效,則不會像添加緩衝區那樣;它只是消失了。無論如何,搶佔你無法控制的東西都會造成這麼多的邊緣。 – Norguard

-1

輪詢實際上沒有任何特別的優雅。不是關於顛覆他們的系統,而是不斷要求代幣。

一個更優雅的解決方案是結合一些功能多態性,遞歸和/或鏈接。

const handleInvalidToken = (request, token, data) => err => 
    invalidTokenErr(err) 
    ? getNewToken().then(token => request(token, data)) 
    : Promise.reject(err); 

const handleSomeRequest = (token, data) => 
    doAThing(token, data) 
    .catch(handleInvalidToken(doAThing, token, data)); 


handleSomeRequest(userData.token, request.body) 
    .then(handleSuccess) 
    .catch(handleCatastrophicFailure); 

你現在已經採取了一切,你有,把它變成了簡單的功能和高階功能,應清楚地理解瘋狂,不雅的代碼,並明確映射的控制流程。

相關問題