2014-11-03 113 views
0

REST服務是否有標準的錯誤消息模型?什麼是REST的最佳ERROR模型

我建立一個REST服務,與Spring REST後端,和骨幹JS基於前端。在所有的項目中,我在那裏都有一些自制的錯誤消息機制,並且自制的客戶端解釋這些錯誤。這通常具有有限的範圍,並用於此特定項目。

現在在我的當前項目我來到了一個點,在這裏我想介紹領域的錯誤在POST請求無效JSON領域。所以我需要擴展我的模型來支持這一點。

從我的角度來看,這是另一個自行車,因爲字段有效性是非常標準的要求,我們的日子,所以我不知道,如果已經有一個錯誤的模型,我可以在我的項目重用。

我在春天好熟悉HandlerExceptionResolver,並在Java中@Valid註解。實際上我正在使用它們。這更像是一種架構類型問題,將這種類型的錯誤傳達給獨立的JS客戶端的最佳模式是什麼。

+0

您必須使用HTTP狀態碼和消息(也稱爲自我描述消息約束),並且可以在主體中以更具體的方式描述錯誤,例如,與多語言錯誤消息和自定義錯誤代碼。請注意,錯誤消息發送給最終用戶,他們不關心確切的異常類型等等。您可以通過調試模式向開發人員發送擴展錯誤消息。 – inf3rno 2014-11-03 22:18:28

+0

我在問關於錯誤機構的模型:)現在我看到了2個分類 - 字段中的錯誤,邏輯錯誤,基本上我問的是什麼是一個更大的圖片,除了字段錯誤和全局錯誤之外什麼是丟失。 – mavarazy 2014-11-04 05:35:37

+0

我認爲缺少一個標準來解耦客戶端與服務的實現。 [Hydra](http://www.markus-lanthaler.com/hydra/spec/latest/core/)確實有一個。我不知道其他錯誤類型,如果你問。通過字段錯誤,你顯然必須使用一些CompositeException,一般的錯誤你必須使用一個簡單的Exception。之後,你必須將其轉換成json,xml等......就這些了。我不認爲這很難。 – inf3rno 2014-11-04 12:27:41

回答

3

我通常做的是創建一個ValidationError模型。在發生驗證錯誤的情況下,該模型以JSON的形式返回給客戶端,同時還包含HTTP狀態代碼,並且它包含客戶端需要了解的錯誤的所有信息。

模型的細節有所不同,但像這樣將是一個良好的開端:

public class ValidationError { 
    private int code; 

    private String message; 

    private Map<String, String> fields; 

    /*...*/ 
} 

現在,當一個無效的表單提交,JSON響應將是這樣的:

{ 
    "code": 400, 
    "message": "invalid form value(s)", 
    "fields": { 
    "username": "the username already exists", 
    "password": "password must be more than 6 characters" 
    } 
} 

這與Spring的@ExceptionHandler很好地結合在一起。當你得到的東西像一個BindException,所有你需要做的是:

@ExceptionHandler(BindException.class) 
@ResponseBody 
@ResponseStatus(value = HttpStatus.BAD_REQUEST) 
private ValidationError handleBindException(BindException ex) { 
    ValidationError validationError = new ValidationError(); 
    /* set code and message */ 
    for (FieldError error : ex.getFieldErrors()) { 
     /* set fields' errors */ 
    } 
    return validationError; 
} 

BindException可以很容易地獲得字段的錯誤。需要更多的工作來挖掘異常中的錯誤,如JsonMappingException

1

推測最好的方法是驗證服務器和客戶端。由於我不熟悉Spring,因此我將限制我的建議給客戶端:Backbone確實有一個validate方法用於您的Backbone模型。 The Backbone docs鼓勵您用自己的驗證邏輯覆蓋此方法。 validate被默認名稱,每當你做一個骨幹模型save(即POST),每當你想運行的驗證碼(例如,你也可以觸發invalid事件,後一個鍵起,用戶點擊提交按鈕前)。

如果你不熱衷於編寫大量的自定義前端的驗證,也有一些插件可用,例如backbone.validation

+0

謝謝,已經使用backbone.validation,這是一個偉大的庫。我最終希望得到錯誤消息的透明性,無論是客戶端驗證還是服務器驗證錯誤,這意味着我需要能夠將服務器錯誤轉換爲骨幹驗證錯誤,但我寧願重複使用現有模型,也不願意發明輪子:) – mavarazy 2014-11-04 07:59:24

相關問題