You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 12:53:23