使用Flurl POST JSON返回400时如何查看验证错误信息?
如何通过Flurl获取400响应中的验证错误信息
当然可以通过Flurl获取验证错误信息。问题出在你当前的代码中,ReceiveJson<T>()在遇到非2xx状态码时会自动抛出FlurlHttpException,而你只通过Polly处理了重试逻辑,没有从异常中提取响应里的错误内容。
解决步骤
- 捕获
FlurlHttpException:该异常包含完整的响应对象,可从中读取错误信息。 - 读取错误响应:通过异常的
Response属性,调用ReceiveJson<ResponseForCreate>()直接反序列化成你的错误模型类,或用GetStringAsync()获取原始JSON字符串。
修改后的代码示例
方式1:捕获异常后读取错误内容
try { var response = await Policy.Handle<FlurlHttpException>() .WaitAndRetryAsync(new[] { TimeSpan.FromSeconds(30) }) .ExecuteAsync(() => $"{_baseEndPoint}{resourceEndPoint}" .WithOAuthBearerToken(bearerToken) .WithHeader("Content-Type", "application/json") .PostStringAsync(bodyText, cancellationToken) .ReceiveJson<T>()); } catch (FlurlHttpException ex) { // 反序列化为你的错误模型类 var validationErrors = await ex.Response.ReceiveJson<ResponseForCreate>(); // 访问具体错误信息,例如: // var nonFieldErrors = validationErrors.NonFieldErrors; // var partyMessages = validationErrors.Parties.Messages; }
方式2:先获取响应再处理状态码(更灵活)
若想避免自动抛出异常,可先获取响应对象,手动判断状态码:
var flurlResponse = await Policy.Handle<HttpRequestException>() .WaitAndRetryAsync(new[] { TimeSpan.FromSeconds(30) }) .ExecuteAsync(async () => await $"{_baseEndPoint}{resourceEndPoint}" .WithOAuthBearerToken(bearerToken) .WithHeader("Content-Type", "application/json") .PostStringAsync(bodyText, cancellationToken)); if (flurlResponse.IsSuccessStatusCode) { var successResponse = await flurlResponse.ReceiveJson<T>(); // 处理成功响应 } else { var validationErrors = await flurlResponse.ReceiveJson<ResponseForCreate>(); // 处理验证错误 }
关键说明
- Flurl默认会对非2xx状态码抛出
FlurlHttpException,这是和HttpClient的核心区别(HttpClient不会自动抛异常)。 FlurlHttpException.Response属性包含完整的响应内容,你可以用Flurl的扩展方法直接反序列化为强类型模型,无需手动处理流或字符串。
内容的提问来源于stack exchange,提问作者Auroops
相关产品推荐
相关产品推荐

