簡體   English   中英

前端和后端之間的錯誤處理

[英]Errorhandling between frontend and backend

在工作中,我們使用 java spring 后端和 vue 前端構建一個 web 應用程序。 目前我們使用 2 或 3 個 http 響應代碼在前端和后端之間傳遞錯誤。 如果您使用錯誤的參數調用和端點,您將收到 BAD_REQUEST。 如果在后端拋出一些異常(與參數無關),后端返回一個 INTERNAL_SERVER_ERROR,如果你傳遞一些不在數據庫中的 id,后端返回一個 NOT_FOUND。

這種方法有多個問題:

  • 我們沒有錯誤情況下的結構可以用來將信息傳遞給用戶(前端)
  • 我們想向用戶指出問題,這些問題不能通過 HTTP 響應代碼進行分類。 例如,如果外部服務不可用,我們希望將服務名稱傳遞給前端。 但我不知道“SERVICE_UNAVAILABLE”是否適合這里......

我已經找到了這個: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM