如何获取返回 Http 状态代码 406 或 400 的 API 的响应 JSON

Posted

技术标签:

【中文标题】如何获取返回 Http 状态代码 406 或 400 的 API 的响应 JSON【英文标题】:How to get response JSON of an API which returns Http Status Code 406 or 400 【发布时间】:2021-10-11 02:53:30 【问题描述】:

Postman 返回一些带有 HTTP 状态代码 406 的响应 JSON,但我用 C# 编写的代码返回相同的 HTTP 状态代码错误消息,但来自 Catch Block。

我的要求是

我使用的 API 总是返回一些响应 JSON,可以是 HTTP 状态码 200 或 400 或任何其他。当我从 post man 测试这些 API 时,它显示响应 JSON,但是当我执行以下行时我的代码返回错误。

HttpWebResponse 响应 = (HttpWebResponse)request.GetResponse();

这是我的完整方法。

private Dictionary<string, string> HTTPCall(CRMRequestData requestData, out bool isError, out string errorMessage)
        
            isError = true;
            errorMessage = "HTTPCall - initial error!";
            try
            
                ServicePointManager.SecurityProtocol = TLS12;

                Dictionary<string, string> responseBag = new Dictionary<string, string>();
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestData.Uri);
                
                request.Method = requestData.HttpMethodName;
                request.ContentType = requestData.ContentType;
                request.ContentLength = string.Format("0", requestData.Body).Length;
                request.Headers.Add("x-api-key", requestData.APIKey);
                if (requestData.Authorization != null)
                
                    request.Headers.Add("Authorization", string.Format("JWT 0",requestData.Authorization));
                

                if (requestData.HttpMethodName.ToUpper().Equals("POST"))
                
                    string body = requestData.Body;
                    Byte[] bytes = Encoding.UTF8.GetBytes(body);
                    using (Stream stream = request.GetRequestStream())
                    
                        stream.Write(bytes, 0, bytes.Length);
                    
                

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();//#Error at this line

                
                string responseData = new StreamReader(response.GetResponseStream()).ReadToEnd();

                if (responseData != null && responseData != "")
                
                    responseBag = ReadResponseJSON(responseData, requestData.CRMMethod, out isError, out errorMessage);
                

                errorMessage = (!isError) ? "HTTPCall - API executed successfully!" : errorMessage;
                return responseBag;
            
            catch (Exception ex)
            
                isError = true;
                errorMessage = string.Format("0", ex.Message);
            
            return null;
        

*注意:- 当 API 返回 HTTP 状态码 200 或 201 时,我的代码块工作正常

【问题讨论】:

使用 HttpWebRequest,399 以上的状态码被视为异常。捕获特定的WebException 而不是一般的异常:如果没有删除响应,您仍然可以读取其内容(在这些情况下,异常可以包含非空响应对象和状态代码)。 谢谢吉米!我得到了它。现在,在 WebException 对象中,我无法找到像邮递员截图那样的响应内容。 如果 Response 对象不为 null 且 Response.ContentLength > 0,则必须阅读。 -- 如果你改用 HttpClient 可能会更简单(.Net 3.5?真的吗?)。 我在 .NETv3.5 中使用 HttpWebRequest。 Response.ContentLength > 100 但我看不到响应 JSON 字符串 内容是Stream,你必须阅读。 【参考方案1】:

试试这个: What is "406-Not Acceptable Response" in HTTP?

简而言之:为Service返回的响应(内容类型)添加Accept标头

【讨论】:

以上是关于如何获取返回 Http 状态代码 406 或 400 的 API 的响应 JSON的主要内容,如果未能解决你的问题,请参考以下文章

Spring 4.1.1 RELEASE 和 @ResponseBody 返回 HTTP 406

Spring 3 + JSON 的问题:HTTP 状态 406?

406(不可接受)。尝试使用 @Responsebody 将对象或整数从 spring 处理函数返回到 ajax 请求

iOS 上的 React Native 返回 HTTP 406 Not Acceptable 错误消息

Spring boot webjars 未生成,返回 Http 406

jQuery:如何从 $.ajax.error 方法中获取 HTTP 状态代码?