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

如何捕获JSON POST请求的实际错误信息而非422错误提示

问题:捕获422状态码的具体错误响应内容

我尝试用HttpWebRequest和WebClient两种方式发送POST请求,想得到和Postman一致的响应结果。当JSON数据正确时请求正常,但JSON错误时,代码只返回通用错误提示"The remote server returned an error: (422) Unprocessable Entity",而Postman能获取到包含具体错误信息的JSON响应(状态码同样是422):

{
"Error": {
"code": "NOT_MATCHING_TAXRATE",
"message": "Error on transaction line 1: Tax rate for HSCode: 0057.11.00 should be '0' instead of '16'."
}
}

我的原始代码如下:

代码片段1(HttpWebRequest实现)

string responsedata = string.Empty;
byte[] dataBytes = Encoding.UTF8.GetBytes(jsonData);

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
request.ContentLength = dataBytes.Length;
request.ContentType = "application/json";
request.Method = "POST";

using (Stream requestBody = request.GetRequestStream())
{
    requestBody.Write(dataBytes, 0, dataBytes.Length);
}

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
    responsedata = reader.ReadToEnd();
}

return responsedata;

代码片段2(WebClient实现)

string result = "";
using (var client = new WebClient())
{
    client.Headers[HttpRequestHeader.ContentType] = "application/json";                    
                    
    result = client.UploadString(url, "POST", jsonData);                   
}

return result;

解决方法

核心原因

HttpWebRequest和WebClient在遇到非2xx状态码时会直接抛出WebException,不会自动读取响应体中的错误内容。要获取具体错误信息,必须在异常处理逻辑中手动读取错误响应流。

1. 修改HttpWebRequest实现

添加异常捕获,从WebException的Response属性中读取错误内容:

string responsedata = string.Empty;
byte[] dataBytes = Encoding.UTF8.GetBytes(jsonData);

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
request.ContentLength = dataBytes.Length;
request.ContentType = "application/json";
request.Method = "POST";

try
{
    using (Stream requestBody = request.GetRequestStream())
    {
        requestBody.Write(dataBytes, 0, dataBytes.Length);
    }

    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    using (Stream stream = response.GetResponseStream())
    using (StreamReader reader = new StreamReader(stream))
    {
        responsedata = reader.ReadToEnd();
    }
}
catch (WebException ex)
{
    if (ex.Response is HttpWebResponse errorResponse)
    {
        using (Stream errorStream = errorResponse.GetResponseStream())
        using (StreamReader reader = new StreamReader(errorStream))
        {
            responsedata = reader.ReadToEnd();
        }
        // 可根据需求将错误内容包装为自定义异常抛出,或直接返回
    }
    else
    {
        // 处理其他网络异常
        throw;
    }
}

return responsedata;

2. 修改WebClient实现

同样通过捕获WebException读取错误响应:

string result = "";
using (var client = new WebClient())
{
    client.Headers[HttpRequestHeader.ContentType] = "application/json";                    
    try
    {
        result = client.UploadString(url, "POST", jsonData);
    }
    catch (WebException ex)
    {
        if (ex.Response is HttpWebResponse errorResponse)
        {
            using (Stream errorStream = errorResponse.GetResponseStream())
            using (StreamReader reader = new StreamReader(errorStream))
            {
                result = reader.ReadToEnd();
            }
        }
        else
        {
            throw;
        }
    }
}

return result;

额外建议:改用HttpClient(更现代的方案)

HttpClient是.NET官方推荐的HTTP客户端,它不会在非2xx状态码时自动抛出异常,而是返回包含完整状态码和响应体的HttpResponseMessage,处理逻辑更简洁直观:

using (var client = new HttpClient())
{
    // 启用压缩(对应原代码的AutomaticDecompression)
    client.DefaultRequestHeaders.AcceptEncoding.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("gzip"));
    client.DefaultRequestHeaders.AcceptEncoding.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("deflate"));

    var content = new StringContent(jsonData, Encoding.UTF8, "application/json");
    var response = await client.PostAsync(url, content);

    // 无论状态码是否成功,先读取响应内容
    string result = await response.Content.ReadAsStringAsync();

    // 可根据状态码判断是否为错误,再做后续处理
    if (!response.IsSuccessStatusCode)
    {
        // 解析错误JSON或直接返回给调用方
    }

    return result;
}

内容的提问来源于stack exchange,提问作者Kinyanjui Kamau

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:40:33