2010-04-25 18 views
1

我們有一個很好的REST API。我們正在重構並決定如何在API內部處理錯誤。在內部使用Java異常來處理REST API用戶錯誤?

例如,用戶需要指定應該取值爲「1984」,「Crash」或「Avatar」的「movie」url參數。首先我們檢查一下它是否有一個有效的值。

如果電影參數無效,最佳方法是什麼?從內部的方法之一

  • 返回NULL併爲您在主API調用方法
  • 空從主API方法

我的內部方法和捕獲異常拋出一個異常認爲這會使我們的代碼更具可讀性和優雅性來使用異常。但是,我們不情願,因爲我們可能因爲用戶API輸入錯誤而拋出許多異常,所以我們的代碼可能是完美的。這似乎不是正確使用例外。如果存在異常情況下的性能損失嚴重,這對於需要收集堆棧跟蹤等是有意義的,那麼當我們需要做的只是告訴用戶參數錯誤時,我們不必要地花費資源。

這些是REST API方法,所以我們不會向API的用戶宣傳異常,我們也不希望即使可能。

那麼這裏最好的做法是什麼?使用醜陋的空值或使用java的異常機制?

+0

當用戶通過電影中的參數「是無效的」,這是否代表了一個錯誤的用戶已經做出,或者是它只是一個搜索小姐? – 2010-04-25 21:33:32

回答

2

都沒有。

關鍵是傳遞一個錯誤的參數並不是那種特殊的條件。特殊情況會引發例外情況。 (這是,這裏不再使用它們的原因,而不是性能。)

你應該使用類似Spring的資料驗證API進行綁定,在傳遞的參數。

一個REST API的客戶端不應該被接受空或異常。他們應該得到一個錯誤消息,讓他們知道發生了什麼,而不會暴露這些細節。 「對不起,我們找不到那部電影」或null?一起去,手下。

+0

沒錯。 RESTful API應該像任何其他應用程序一樣驗證用戶輸入。如果輸入錯誤,請告訴用戶原因。如果錯誤的輸入使得過去您的過濾器/驗證,然後就是在適當的時候拋出一個異常,記錄它,並通知開發團隊,讓他們可以修復驗證(或任何爲越野車)。 – timdev 2010-04-25 21:37:28

0

我會假設你在這裏進行輸入驗證,在這種情況下,你的數據庫會爲安全字符串做一個查詢,並且它不會找到記錄,因爲它不存在於你的數據庫中,好嗎?

如果你正在使用任何MVC框架模型應該拋出一個RecordNotFound異常沒有?

如果您總是期望找到一個值,那麼拋出異常如果它丟失。這個例外意味着有問題。

如果該值可能丟失或存在,並且兩者都對應用程序邏輯有效,則返回null。

更重要的是:你在代碼的其他地方做了什麼?一致性很重要。

1

如果出現無效請求(例如驗證錯誤),則應顯示400狀態碼(錯誤請求)。

內部我也想創造一個例外層次結構將映射到HTTP休息域(見錯誤情況的狀態碼)。

例子(簡體和被檢查異常):

 

class RESTBaseException extends RuntimeException{ 
    int statusCode; 

    public RESTBaseException(int statusCode){ this.statusCode=statusCode; } 

    //if no statusCode passed we fallback to very broad 500 server error. 
    public RESTBaseException(){ this.statusCode=500; } 
} 

class RESTValidationException extends RESTBaseException{ 

    RESTValidationException(){ 
     super(404); 
    } 
} 
 

您可以通過駛過的錯誤消息上面的例子擴展到構造函數來使客戶更加滿意。

後來你應該抓住這些異常有專用的異常處理程序在你的servlet處理程序鏈(測繪的狀態碼servlet響應)。例如在春季mvc中有很好的例外處理解決方案。

通常我不喜歡創造了深刻的自定義異常hierachies但我認爲REST API層他們是OK(因爲狀態代碼後傳播)。