如何捕获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
相关产品推荐
相关产品推荐

