如何理解HTTP响应的状态码

Posted

tags:

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

参考技术A 1xx

1xx表示请求已被接受,但需要后续处理。例如:
100(Continue)

客户端应继续发送请求。
101(Switching Protocols)

需要切换协议,服务器通过的Upgrade响应头字段通知客户端。
html5引入的WebSocket便是这样工作的。首先客户端请求websocket所在的URL,服务器返回101,然后便建立了全双工的TCP连接。 注意Upgrade和Connection头字段属于Hop-by-hop字段,设置Websocket代理时需要继续设置这两个字段,而不是简单地转发请求。
2xx

请求已成功被服务器接收、理解、并接受。
200(OK)

请求已成功,请求所希望的响应头或数据体将随此响应返回。
201(Created)

请求已经被实现,而且有一个新的资源已经依据请求的需要而创建。在RESTFul风格的URL设计中,通常用来响应POST请求。
202(Accepted)

服务器已接受请求,但尚未处理。比如POST一个资源应当返回201,但由于性能原因未能立即创建,可以返回202。
204(No Content)

服务器成功处理了请求,但不需要返回任何实体内容,204响应禁止包含任何消息体。浏览器收到该响应后不应产生文档视图的变化。
205(Reset Content)

服务器成功处理了请求,但不需要返回任何实体内容,205响应禁止包含任何消息体。 与204不同的是,返回此状态码的响应要求请求者重置文档视图。比如用户刚刚提交一个表单,返回205后页面重置,用户可以立即填写下一个表单。
206(Partial Content)

HTTP协议允许分片传输。请求头中包含Range字段时,响应需要只返回Range指定的那一段。响应中应包含Content-Range来指示返回内容的范围。
其他

203(Non-Authoritative Information)
207(Multi-Status)
3xx

这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向, 重定向目标在本次响应的Location头字段中指明。
301(Moved Permanently)

被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。如果该请求不是GET/HEAD, 浏览器通常会要求用户确认重定向。
301通常用于网站迁移时,服务器对旧的URL进行301重定向到新的URL。这样搜索引擎可以正确地更新原有的页面排名等信息。
302(Found)

请求的资源现在临时从不同的URI响应请求。除非指定了Cache-Control或Expires,否则该响应不可缓存。 如果当前请求非HEAD或GET,浏览器需取得用户确认,再进行重定向。
这很好理解,因为上下文发生了变化,比如POST请求不是幂等的。
303(See Other)

对应当前请求的响应可以在另一个URI上被找到,而且客户端应当采用GET的方式访问那个资源。 这个方法的存在主要是为了允许由脚本激活的POST请求输出重定向到一个新的资源。 303响应禁止被缓存。
303会使得浏览器直接GET那个资源,不需用户同意。这是Web应用中最常见的重定向方式。
304(Not Modified)

如果客户端发送了一个带条件的GET请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变。 304响应禁止包含消息体。
304响应也是一种缓存机制。Web服务器对静态资源文件通常会采取缓存,因此在Web开发中你可以看到大量的304响应。 服务器给出的相应中通常会包含Etag来标识资源ID,比如:
ETag: "686897696a7c876b7e"
客户端在下次访问同一URL时会设置头字段If-None-Match(这是一个请求条件):
If-None-Match: "686897696a7c876b7e"
服务器返回资源前会判断Etag是否与客户端提供的If-None-Match匹配,如果匹配则说明资源未发生改变,此时应返回304.

http状态码理解

hhtp状态码
::::

1xx :消息 这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束

100 continue :客户端还要继续向服务器发送请求,这个只是临时请求响应,表明这一部分服务器正常接收了,如何你的请求完成了,就忽略这个响应,服务器必须在请求响应结束后向客户端发送一个最终响应。
             101 switching Protocols :服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议
             102 Processing :由WebDAV扩展的状态码,代表处理将被继续执行

2xx :成功 这一类型的状态码,代表请求已成功被服务器接收、理解、并接受
            200 OK :成功访问,请求被服务器正常处理。
            201 Created:请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其 URI 已经随Location 头信息返回。假如需要的资源无法及时建立的话,应当返回 ‘202 Accepted‘
            202 Accepted:表示服务器接受到请求,但不一定会被执行,这个状态码适合在异步操作的时候用,另外返回202状态码的响应也可以允许服务器接受其他过程的请求(例如某个每天只执行一次的基于批处理的操作),而不必让客户端一直保持与服务器的连接直到批处理操作全部完成。在接受请求处理并返回202状态码的响应应当在返回的实体中包含一些指示处理当前状态的信息,以及指向处理状态监视器或状态预测的指针,以便用户能够估计操作是否已经完成
            203 Non-Authoritative Information :服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。当前的信息可能是原始版本的子集或者超集。例如,包含资源的元数据可能导致原始服务器知道元信息的超集。使用此状态码不是必须的,而且只有在响应不使用此状态码便会返回200 OK的情况下才是合适的
            204 No Content :服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。响应可能通过实体头部的形式,返回新的或更新后的元信息。如果存在这些头部信息,则应当与所请求的变量相呼应,由于204响应被禁止包含任何消息体,因此它始终以消息头后的第一个空行结尾
           205 Reset Content :服务器成功处理了请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图。该响应主要是被用于接受用户输入后,立即重置表单,以便用户能够轻松地开始另一次输入,与204响应一样,该响应也被禁止包含任何消息体,且以消息头后的第一个空行结束。
3xx: 重定向 这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的 Location 域中指明,当且仅当后续的请求所使用的方法是 GET 或者 HEAD 时,用户浏览器才可以在没有用户介入的情况下自动提交所需要的后续请求
          301 Moved Permanently :被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。   新的永久性的 URI 应当在响应的 Location 域中返回。除非这是一个 HEAD 请求,否则响应的实体中应当包含指向新的 URI 的超链接及简短说明。   如果这不是一个 GET 或者 HEAD 请求,因此浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。   注意:对于某些使用 HTTP/1.0 协议的浏览器,当它们发送的 POST 请求得到了一个301响应的话,接下来的重定向请求将会变成 GET 方式。
           302 Move temporarily :请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。   新的临时性的 URI 应当在响应的 Location 域中返回。除非这是一个 HEAD 请求,否则响应的实体中应当包含指向新的 URI 的超链接及简短说明。   如果这不是一个 GET 或者 HEAD 请求,那么浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。   注意:虽然RFC 1945和RFC 2068规范不允许客户端在重定向时改变请求的方法,但是很多现存的浏览器将302响应视作为303响应,并且使用 GET 方式访问在 Location 中规定的 URI,而无视原先请求的方法。状态码303和307被添加了进来,用以明确服务器期待客户端进行何种反应。
          303 See Other :对应当前请求的响应可以在另一个 URI 上被找到,而且客户端应当采用 GET 的方式访问那个资源。这个方法的存在主要是为了允许由脚本激活的POST请求输出重定向到一个新的资源。这个新的 URI 不是原始资源的替代引用。同时,303响应禁止被缓存。当然,第二个请求(重定向)可能被缓存
4xx: 请求错误 这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。除非响应的是一个 HEAD 请求,否则服务器就应该返回一个解释当前错误状况的实体,以及这是临时的还是永久性的状况。这些状态码适用于任何请求方法。浏览器应当向用户显示任何包含在此类错误响应中的实体内容。如果错误发生时客户端正在传送数据,那么使用TCP的服务器实现应当仔细确保在关闭客户端与服务器之间的连接之前,客户端已经收到了包含错误信息的数据包。如果客户端在收到错误信息后继续向服务器发送数据,服务器的TCP栈将向客户端发送一个重置数据包,以清除该客户端所有还未识别的输入缓冲,以免这些数据被服务器上的应用程序读取并干扰后者
           400 Bad Request :1、语义有误,当前请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。出现这个错误的最有可能的原因是服务器端没有这个页面
请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。
2、请求参数有误。
           401 Unauthorized :当前请求需要用户验证。该响应必须包含一个适用于被请求资源的 WWW-Authenticate 信息头用以询问用户信息。客户端可以重复提交一个包含恰当的 Authorization 头信息的请求。如果当前请求已经包含了 Authorization 证书,那么401响应代表着服务器验证已经拒绝了那些证书。如果401响应包含了与前一个响应相同的身份验证询问,且浏览器已经至少尝试了一次验证,那么浏览器应当向用户展示响应中包含的实体信息,因为这个实体信息中可能包含了相关诊断信息
          403 Forbidden :服务器已经理解请求,但是拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。如果这不是一个 HEAD 请求,而且服务器希望能够讲清楚为何请求不能被执行,那么就应该在实体内描述拒绝的原因。当然服务器也可以返回一个404响应,假如它不希望让客户端获得任何信息
          404 Not Found :请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。出现这个错误的最有可能的原因是服务器端没有这个页面
         405 Method Not Allowed :请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个Allow 头信息用以表示出当前资源能够接受的请求方法的列表
         413 Request Rntity Too Large :服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围。此种情况下,服务器可以关闭连接以免客户端继续发送此请求。如果这个状况是临时的,服务器应当返回一个 Retry-After 的响应头,以告知客户端可以在多少时间以后重新尝试
         414 Request-URI Too Long :请求的URI 长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务。这比较少见,通常的情况包括:
本应使用POST方法的表单提交变成了GET方法,导致查询字符串(Query String)过长。
重定向URI “黑洞”,例如每次重定向把旧的 URI 作为新的 URI 的一部分,导致在若干次重定向后 URI 超长。
客户端正在尝试利用某些服务器中存在的安全漏洞攻击服务器。这类服务器使用固定长度的缓冲读取或操作请求的 URI,当 GET 后的参数超过某个数值后,可能会产生缓冲区溢出,导致任意代码被执行[1]。没有此类漏洞的服务器,应当返回414状态码。
5xx :服务器错误 这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。除非这是一个HEAD 请求,否则服务器应当包含一个解释当前错误状态以及这个状况是临时的还是永久的解释信息实体。浏览器应当向用户展示任何在当前响应中被包含的实体
          500 Internal Server Error :服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。

:::

 


























以上是关于如何理解HTTP响应的状态码的主要内容,如果未能解决你的问题,请参考以下文章

如何理解HTTP响应的状态码

如何理解HTTP响应的状态码

http状态码理解

HTTP响应状态码

HTTP响应状态码

HTTP响应状态码