我有一個基於Spring MVC的應用程序服務器,它通過JSON與客戶端進行通信。 客戶端可以執行的查詢之一是「我有待處理的消息嗎?」 要做到這一點,客戶端創建一個認證對象並將其發佈到服務器。作爲回報,服務器發送一個待處理消息列表,for ex. List<PendingMessage>
通知客戶端有關異常
現在,如果沒有掛起的消息,我返回null。但問題是,如何通知客戶端如果我有一個錯誤,例如,數據庫連接已經丟失,身份驗證是錯誤的,還是我願意與客戶端分享的任何其他異常?
我有一個基於Spring MVC的應用程序服務器,它通過JSON與客戶端進行通信。 客戶端可以執行的查詢之一是「我有待處理的消息嗎?」 要做到這一點,客戶端創建一個認證對象並將其發佈到服務器。作爲回報,服務器發送一個待處理消息列表,for ex. List<PendingMessage>
通知客戶端有關異常
現在,如果沒有掛起的消息,我返回null。但問題是,如何通知客戶端如果我有一個錯誤,例如,數據庫連接已經丟失,身份驗證是錯誤的,還是我願意與客戶端分享的任何其他異常?
您可以捕獲代碼可能拋出的不同類型的異常。基於此,您可以定義自己的自定義消息&將其丟給客戶端。在客戶端,您只需在Exception上執行getMessage()。這應該可以解決問題。
你可以純粹拋出異常來做到這一點。 SpringMVC將異常映射到標準http狀態代碼(200s,400s,500s等)。就像您在Java中編寫代碼時一樣,您可以創建自定義例外以適應您的特定需求。
如果你正在設計客戶端和服務器,那麼你可能想要定義某種協議,這可能很有趣。您可以將您的Web服務器視爲一個rpc服務器,該服務器以給定請求的定義格式返回數據。
例如,使用HTTP狀態代碼,一個成功的響應可能會返回以下數據:
{
status: 200,
message: "OK",
data: {
name: John Doe,
age: 31
},
error: null
}
導致一個錯誤的請求:
{
status: 400,
message: "Bad Request",
data: null,
error: "Database request timed out"
}
你會非常有嘗試捕獲塊捕獲任何預期的異常,然後可以將其轉換爲適當的JSON響應,概述客戶端可以處理的問題。
如果請求在到達servlet之前僅發生錯誤,則用於發出請求的API可能會公開某種類型的onError回調,然後可以使用該回調來通知客戶端錯誤。
從HTTP響應狀態碼開始。例如,如果您有數據庫連接問題,則返回500內部服務器錯誤。
此方法可能無法爲您的客戶提供他們所需的全部信息。因此,另外,您可以在響應正文中提供JSON的詳細信息。不管你想要結構這個JSON。如果您希望客戶端應用在收到您的回覆後轉到特定網址,請考慮在回覆中提供該網址。
最後一點:將200 OK與響應正文中的錯誤結合起來將會是一種糟糕的形式。我以前見過這個,而且很煩人。
你已經有了一個很好的標題,但我的服務器接受從數據庫中檢索到的對象,並自動將它們轉換爲JSON格式(jersey + jackson),所以我不能真正做你所提供的... – stdcall 2011-12-28 19:42:15
你應該只需將它包裝到自定義的json響應中,其中「data」屬性是從數據庫返回的json數據......它確實不應該是一個問題,特別是因爲有太多的json序列化API用於java – 2011-12-28 19:55:55
我通常使用org.json,但從傑克遜JSON處理器庫的初步瀏覽,它真正顯示允許這樣簡單的事情 – 2011-12-28 19:59:23