2017-04-26 95 views
0

我有一個UI(角度),作爲Spring引導應用程序託管, UI與REST API(Jersey)對話。 當整個應用程序或其中的一部分進行維護時:REST:處理網站維護

1)我不確定,如何向任何現在訪問的人顯示維護網頁(它應該是角度還是彈簧引導,後端,以及如何?)。

2)對於已經在網站某個部分的用戶,我如何通知他們他們需要刷新。

3)對於已經在網站某個部分的用戶,如果他們沒有刷新,並且以後在維護結束後,如果他們發送帶有一些舊的無效數據的POST請求,我該如何檢查?

注意:該網站沒有任何用戶驗證。

作爲第三點的示例: UI顯示數據庫中記錄的列表,並且用戶正在對其中一個記錄進行更改,同時後端進入維護狀態。現在,此用戶提交更改後的數據,當後端再次可用時。但是這個數據現在是無效的。我怎麼能識別,並可能通知用戶。

回答

0

通過維護我猜你的意思是你的API使用的一些數據庫是更新或備份或類似的。在這種情況下,如果API無法處理該命令,我會讓它返回一個503 Service Unavailable響應代碼,並讓前端向用戶顯示一些格式良好的信息。

爲了確定客戶端是否發送舊數據,您可以使用ETagLast-Modified標題。 ETags基本上是當前資源狀態的散列。如果狀態改變,那麼ETag哈希也是如此。試圖更新資源狀態的客戶端將以前獲取的ETag散列與資源的新狀態一起發送給API,然後API可以檢查是否存在由某個其他客戶端應用於資源的中間變更,並因此返回對於客戶端來說它不會對最新版本採取行動的錯誤。條件請求在RFC 7232中定義。

關於你的第二個問題,我不完全確定你要完成什麼。關於使用AJAX,我會說一口氣。他們到底需要刷新什麼?維護期間是否有一些資源數據發生變化?如果不是,他們爲什麼還要關心刷新?如果表單輸入數據應該被重置,那麼API可能會響應一個205 Reset Content響應代碼,儘管這表示API已經完成了請求並通知客戶重置輸入數據。如果由於主要原因API無法處理請求,我還會返回503 Service Unavailable錯誤,並讓前端通過AJAX向各個客戶端發佈信息,如果這是您的要求。

+0

感謝您的相當詳細的解釋。 是的,通過更新我的意思是數據庫我會改變和新的記錄可能會被添加。關於第二個問題,如果某些記錄被添加到數據庫(或刪除),如果當前用戶正在他的屏幕上使用這些記錄,那麼現在它是無效的,並且如果他在更改後將更改的記錄提交回API ,那麼我需要確定它來自舊頁面,可能忽略它。 – gaurav5430

+0

在這種情況下,我會生成一個當前狀態的哈希值,並將其作爲ETag頭與響應一起發送,並且如果在維護過程中某些記錄的狀態發生更改(通過您應用的任何邏輯),嘗試更新記錄一個處理了無效數據的客戶端應該會失敗,因爲前提條件沒有得到滿足(當前ETag值與用戶嘗試更新的值不同)。如果在維護期間沒有更改狀態並且用戶更新「舊」狀態,則更新將成功,因爲舊數據等於更新前的狀態,因此不會出現衝突。 –

0

1)由於API無法知道前端的任何信息,因此我們不應該將邏輯放在那裏。而且,如果不通過API進行通信,Angular無法知道後端的任何信息。如果您將API或Spring Boot降爲維護,會發生什麼情況?角落不會知道,除非你讓它處理這些服務不可用時收到的迴應。

2)從Angular中,您可以對REST API的超時進行某種ping操作。然後在索引中有一個函數來檢查API響應的狀態。如果維護,重定向到維護頁面。這會讓你覺得它聽起來像你想要的現場連接,雖然它會增加網絡開銷,並且讓你的API變得更加困難。否則,如果您可以等到用戶執行一個涉及您的API的操作,那麼您可以處理服務關閉時返回的任何http錯誤代碼。

3)你怎麼知道它是舊的?這是一個安全問題嗎?如果無法從通常傳輸的數據中分辨出來,可以添加某種時間戳,但這很容易規避。如果這是你想要的方式,那麼時間戳上有很多話題。

+0

如果Angular app + Spring Boot正在維護中,誰負責顯示維護頁面,它應該是前端的新路線,還是應該是Spring Boot應用程序中的過濾器,它將所有請求路由到503? – gaurav5430

+0

IMO取決於哪些服務受到影響。如果會有一個只有Angular將無法訪問的實例,Spring一方應該處理它。如果只有API /彈簧一側將無法訪問,Angular應該處理它。我無法想象Angular會在維護中進行維護的情況,因爲它被編譯爲html和js,您只需在5秒鐘的停機時間內將新文件放置到位。如果只有數據庫將被維護,你可以把它放在Spring中,這將是最優雅的解決方案。 – Michael