如何才能获取到http的响应状态码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何才能获取到http的响应状态码相关的知识,希望对你有一定的参考价值。

参考技术A HttpWebResponse.StatusCode:

Accepted

等效于 HTTP 状态 202。Accepted 指示请求已被接受做进一步处理。
Ambiguous

等效于 HTTP 状态 300。Ambiguous 指示请求的信息有多种表示形式。默认操作是将此状态视为重定向,并遵循与此响应关联的 Location 头的内容。
如果 HttpWebRequest.AllowAutoRedirect 属性为 false,则 Ambiguous 将导致引发异常。

Ambiguous 是 MultipleChoices 的同义词。

BadGateway

等效于 HTTP 状态 502。BadGateway 指示中间代理服务器从另一代理或原始服务器接收到错误响应。
BadRequest

等效于 HTTP 状态 400。BadRequest 指示服务器未能识别请求。如果没有其他适用的错误,或者如果不知道准确的错误或错误没有自己的错误代码,则发送 BadRequest。
Conflict

等效于 HTTP 状态 409。Conflict 指示由于服务器上的冲突而未能执行请求。
Continue

等效于 HTTP 状态 100。Continue 指示客户端可能继续其请求。
Created

等效于 HTTP 状态 201。Created 指示请求导致在响应被发送前创建新资源。
ExpectationFailed

等效于 HTTP 状态 417。ExpectationFailed 指示服务器未能符合 Expect 头中给定的预期值。
Forbidden

等效于 HTTP 状态 403。Forbidden 指示服务器拒绝满足请求。
Found

等效于 HTTP 状态 302。Found 指示请求的信息位于 Location 头中指定的 URI
处。接收到此状态时的默认操作为遵循与响应关联的 Location 头。原始请求方法为 POST 时,重定向的请求将使用
GET 方法。
如果 HttpWebRequest.AllowAutoRedirect 属性为 false,则 Found 将导致引发异常。

Found 是 Redirect 的同义词。

GatewayTimeout

等效于 HTTP 状态 504。GatewayTimeout 指示中间代理服务器在等待来自另一个代理或原始服务器的响应时已超时。
Gone

等效于 HTTP 状态 410。Gone 指示请求的资源已不再可用。
HttpVersionNotSupported

等效于 HTTP 状态 505。HttpVersionNotSupported 指示服务器不支持请求的 HTTP 版本。
InternalServerError

等效于 HTTP 状态 500。InternalServerError 指示服务器上发生了一般错误。
LengthRequired

等效于 HTTP 状态 411。LengthRequired 指示缺少必需的 Content-length 头。
MethodNotAllowed

等效于 HTTP 状态 405。MethodNotAllowed 指示请求的资源上不允许请求方法(POST 或 GET)。
Moved

等效于 HTTP 状态 301。Moved 指示请求的信息已移到 Location 头中指定的 URI
处。接收到此状态时的默认操作为遵循与响应关联的 Location 头。原始请求方法为 POST 时,重定向的请求将使用
GET 方法。
Moved 是 MovedPermanently 的同义词。

MovedPermanently

等效于 HTTP 状态 301。MovedPermanently 指示请求的信息已移到 Location 头中指定的 URI 处。接收到此状态时的默认操作为遵循与响应关联的 Location 头。
MovedPermanently 是 Moved 的同义词。

MultipleChoices

等效于 HTTP 状态 300。MultipleChoices 指示请求的信息有多种表示形式。默认操作是将此状态视为重定向,并遵循与此响应关联的 Location 头的内容。
如果 HttpWebRequest.AllowAutoRedirect 属性为 false,则 MultipleChoices 将导致引发异常。

MultipleChoices 是 Ambiguous 的同义词。

NoContent

等效于 HTTP 状态 204。NoContent 指示已成功处理请求并且响应已被设定为无内容。
NonAuthoritativeInformation

等效于 HTTP 状态 203。NonAuthoritativeInformation 指示返回的元信息来自缓存副本而不是原始服务器,因此可能不正确。
NotAcceptable

等效于 HTTP 状态 406。NotAcceptable 指示客户端已用 Accept 头指示将不接受资源的任何可用表示形式。
NotFound

等效于 HTTP 状态 404。NotFound 指示请求的资源不在服务器上。
NotImplemented

等效于 HTTP 状态 501。NotImplemented 指示服务器不支持请求的函数。
NotModified

等效于 HTTP 状态 304。NotModified 指示客户端的缓存副本是最新的。未传输此资源的内容。

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

【中文标题】如何获取返回 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的响应状态码的主要内容,如果未能解决你的问题,请参考以下文章

如何从 WinHttp 请求中获取 HTTP 状态码?

如何从 jQuery.ajax 获取响应状态码?

12.FastAPI响应状态码

在 WebFlux WebClient 中测试状态码时如何获取响应正文?

http状态码

获取状态码 http.get 响应 angular2