[英]Errorhandling between frontend and backend
在工作中,我們使用 java spring 后端和 vue 前端構建一個 web 應用程序。 目前我們使用 2 或 3 個 http 響應代碼在前端和后端之間傳遞錯誤。 如果您使用錯誤的參數調用和端點,您將收到 BAD_REQUEST。 如果在后端拋出一些異常(與參數無關),后端返回一個 INTERNAL_SERVER_ERROR,如果你傳遞一些不在數據庫中的 id,后端返回一個 NOT_FOUND。
這種方法有多個問題:
我已經找到了這個: https://www.baeldung.com/spring-response-status-exception我們可以使用消息字段傳遞有關錯誤的詳細信息(消息字段中的特定錯誤 json)。 這是一個好主意嗎?
意見?
噸
您當然可以在此字段中傳回信息,但使用ResponseStatusException
s。 根據前端需要多少信息(例如,如果它只是向用戶顯示一條用戶友好的消息),這可能足以滿足您的需求。
如果您想在響應中使用自定義 object(尤其是每個異常/響應代碼),另一種方法是使用@ControllerAdvice
並擴展ResponseEntityExceptionHandler
。
例如,假設您有一個自定義異常ExternalServiceUnavailableException
,它具有一些您可以從中檢索的基礎ServiceInformation
。 然后你可以做類似的事情
public class ServiceInformation {
private final String name;
private final String status;
private final String statusMessage;
//snip
}
@ControllerAdvice
public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler({ ExternalServiceUnavailableException.class })
public ResponseEntity<Object> handleExternalServiceUnavailable(ExternalServiceUnavailableException ex, WebRequest request) {
final ServiceInformation si = ex.getServiceInformation();
return ResponseEntity
.status(503) // or whatever code you want
.body(si); // or map to some other object/format
// or use the constructor to supply headers etc.
}
}
當您拋出ExternalServiceUnavailableException
時,這將導致響應正文如下
{
"name": "my-external-service",
"status": "timeout",
"statusMessage": "Service timed out after 30 seconds"
}
可以在下面的文章中找到更完整的示例,其中相同的自定義錯誤 object 用於后果的每個異常以及默認處理程序。
https://www.baeldung.com/exception-handling-for-rest-with-spring
這使前端更容易解釋(就像您提出的方法一樣),因為只有一種格式可以預期和解析,但您可以自由地為每個異常返回不同的響應形狀。
編輯:值得記住的是,還有響應代碼 502(網關錯誤)和 504(網關超時)可用於指示外部服務不可用或超時。 如果這些是合適的,您可以只使用適當的ResponseStatusExceptions
和消息集以包含服務名稱(或其他信息)。 如上所述,這取決於您需要/希望前台接收什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.