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