更好地实施 Blazor WASM Api 响应?

Better implementation of Blazor WASM Api response?

我在我的 Blazor WASM 项目中有一个注入 HttpClient class 的 http 服务。我有这样的方法:

public async Task<CommunityDto> GetCommunity(Guid CommunityId)
{
   if (string.IsNullOrEmpty(CommunityId.ToString())) return null;
   var response = await _httpClient.GetAsync($"api/communities/{CommunityId}");
   if (response.IsSuccessStatusCode)
   {
      var content = await response.Content.ReadAsStringAsync();
      return JsonSerializer.Deserialize<CommunityDto>(content, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
   }
   else
   {
      throw new Exception(response.ReasonPhrase);
   }
}

在我的组件中,我有以下内容:

protected async override Task OnInitializedAsync()
{
   try
   {
      CommunityFromAPI = await CommunityService.GetCommunity(Id);
   }
   catch (Exception ex)
   {
      ToastService.ShowError($"Failed to get community! {ex.Message}");
      NavManager.NavigateTo("/");
    }
}

除了全局异常处理,有没有更好的方法来处理这个问题?我故意从我的 API 返回 400 错误,而我的“catch”没有捕获异常并抛出 toast 消息。我是 Blazor 的新手,所以任何帮助或指示将不胜感激。

我通常会创建一个这样的复合对象:

public class ResultObj
    {
        public ResultObj(YourClass result, string errorCode = null, string errorMessage = null)
        {
            this.Result= resultados;
            this.ErrorCode = codigoErro;
            this.ErrorMessage = mensagemErro;
        }

        public string ErrorMessage { get; set; }
        public List<object> Result{ get; set; }
        public string ErrorCode { get; set; }
    }

在您的调用中,您将其转换到一个 try catch 块中以防序列化失败。

如果序列化工作正常,那么您检查 ErrorCode 和 ErrorMessage 字段,然后调用您的 toasts 等等。

总的来说,您的设计绝对是在正确的轨道上,感谢您就 Blazor 应用中的错误提供用户反馈。

我有几个建议。

  1. 使用 API 客户端的 exception.Message 向您的用户展示是可以的,但它会将您的 UI 与您的 API 访问错误联系起来层。例如,假设您的 API 不可用并且 GetAsync 抛出 HttpRequestException,那么您将向用户显示该错误消息文本。一种选择是引入您自己的异常类型,由您的 API 层抛出,由您的 UI 捕获,并有意显示给用户。另一种选择是让您的 API 层 return 为空,然后在您的 UI 中向用户显示一般错误消息(例如“社区不可用”)。还有一个选项(已经建议)是从你的 API 层引入一个“return 类型”,它包含数据 and/or 错误状态(但该实现应该是通用的,即, ApiResponse<TReturnData>)。所有选项(包括您的选项)都可以正常工作。在考虑选项时,我会问自己“我真正想向用户显示哪些错误消息?哪些代码最容易维护?”

  2. 第二个建议是如果你可以使用扩展方法ReadFromJsonAsync<>https://docs.microsoft.com/en-us/dotnet/api/system.net.http.json.httpcontentjsonextensions.readfromjsonasync?view=net-5.0),那么你可以将这段代码缩短为:

     if (response.IsSuccessStatusCode)
     {
          return await response.Content.ReadFromJsonAsync<CommunityDto>(
                          new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
     }