[英]Should all HTTP error responses have the same JSON structure?
我們正在使用Spring Boot開發REST服務,並且想知道每個錯誤響應是否都應具有相同的JSON結構?
對於錯誤情況,我們的服務將以簡單的JSON格式進行響應。 例如,如果參數格式錯誤,我們將以HTTP狀態400
和JSON進行響應:
{
"errorCode": 05,
"message": "provided paramter XY is malformed"
}
errorCode
是我們的自定義代碼ID。 有人可能會爭論這種設計是否好,但是它很簡單並且可以被服務使用者輕松地處理。
現在,Spring Boot會自動創建一些錯誤響應。 例如,對於TypeMismatchException
,將創建HTTP狀態為400
響應。 但是,當然,這些自動生成的響應沒有錯誤格式。
因此...我們遇到的情況是,服務使用者是否事先知道HTTP狀態400
是否在主體中具有簡單的JSON錯誤格式。 我們是否應該真正覆蓋所有Spring Boot默認異常處理以在每個響應中放入我們的格式,還是服務使用者應該吞下苦澀的葯丸並確定是否使用了簡單的JSON格式?
這取決於您的項目規模。 如果許多應用程序都使用您的API,則應采用“捕獲所有內容並使用JSON格式”的方法。 是的,您還有更多工作要做,但是當公司中的所有其他應用程序都可以使用您的標准方式時,它們可以節省大量時間。
在我參與的大多數項目中,我們也有一種“標准方式”來返回我們的錯誤響應(也是JSON):
@RestControllerAdvice
public class GlobalResourceExceptionHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(GlobalResourceExceptionHandler.class);
// the class ValidationError contains the properties the json should contain.
@ExceptionHandler(Exception.class)
public List<ValidationError> exceptionHandler(Exception e, HttpServletResponse response) {
LOGGER.warn("Exception thrown in a resource", e);
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
return Collections.singletonList(new ValidationError(null, "unexpected exception"));
}
}
您可以使用更多@ExceptionHandler
擴展類。
事實證明,這是一個很好的方法,因為它易於實現(對於小型應用程序),並且涉及很多方面。 基本上,很多意味着與休息請求有關的一切。 排除的是資源處理程序,它提供了angular-app和安全層。
更新:結論:當擁有許多應用程序使用的api時,可以捕獲所有內容。 在兩種情況下(小應用程序或大應用程序),都應使用上面顯示的方式開始錯誤處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.