RestSharp调用POST接口遇422错误无法获取响应内容的解决方法
解决422错误无法获取响应内容的问题
问题根源
你当前配置了ThrowOnAnyError = true,这会让RestClient在收到非成功状态码(比如422)时直接抛出异常,导致代码无法进入else分支读取response.Content,而是直接跳到catch块。
解决方案
方案1:关闭自动抛异常
修改RestClientOptions,将ThrowOnAnyError设为false,这样PostAsync会返回所有状态码的响应,你可以在else分支正常解析错误内容:
options = new RestClientOptions { ThrowOnAnyError = false, MaxTimeout = -1, };
修改后,原有代码的else分支会被触发,能正常反序列化服务端返回的错误响应。
方案2:捕获RestSharp的ApiException
如果不想改变ThrowOnAnyError的配置,可以在catch块中优先捕获RestSharp的ApiException,该异常包含完整的响应信息:
public async Task<Procesar> SendProcessAsync(Procesar procesar) { try { var client = new RestClient(options); var request = new RestRequest($"{url}request/{procesar.request_token}/process", Method.Post); request.AddHeader("Content-Type", "application/json"); request.AddHeader("Accept", "application/json"); request.AddHeader("Authorization", $"Bearer {token.access_token}"); var param = new { procesar.status_node, procesar.worknote }; request.AddBody(param); var response = await client.PostAsync(request); if (response.IsSuccessful) { return JsonConvert.DeserializeObject<Procesar>(response.Content); } else { throw new Response_Exception(JsonConvert.DeserializeObject<Response_Error>(response.Content)); } } catch (ApiException apiEx) { if (apiEx.Response != null && !string.IsNullOrEmpty(apiEx.Response.Content)) { var error = JsonConvert.DeserializeObject<Response_Error>(apiEx.Response.Content); logger.Error($"请求失败: {error.error_msg}", apiEx); throw new Response_Exception(error); } logger.Error(apiEx); throw; } catch (Exception exception) { logger.Error(exception); throw; } }
注意:需要确保项目引用了RestSharp,并且Response_Error类的结构与服务端返回的错误JSON完全匹配,否则反序列化会失败。示例Response_Error结构如下:
public class Response_Error { public int error_code { get; set; } public string error_msg { get; set; } public ExtraData extra_data { get; set; } } public class ExtraData { public string message { get; set; } public List<ErrorDetail> errors { get; set; } } public class ErrorDetail { public string field { get; set; } public string message { get; set; } public string parameters { get; set; } }
内容的提问来源于stack exchange,提问作者Arturo Perez
相关产品推荐
相关产品推荐

