如何理解HTTP响应的状态码
2016-08-20
HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。
消息(1字头):这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。由于 HTTP/1.0 协议中没有定义任何 1xx 状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送 1xx 响应。
成功(2字头):这一类型的状态码,代表请求已成功被服务器接收、理解、并接受
重定向(3字头):这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的 Location 域中指明。
请求错误(4字头):这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。除非响应的是一个 HEAD 请求,否则服务器就应该返回一个解释当前错误状况的实体,以及这是临时的还是永久性的状况。这些状态码适用于任何请求方法。浏览器应当向用户显示任何包含在此类错误响应中的实体内容。
服务器错误(5、6字头):这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。除非这是一个HEAD 请求,否则服务器应当包含一个解释当前错误状态以及这个状况是临时的还是永久的解释信息实体。浏览器应当向用户展示任何在当前响应中被包含的实体。
这些状态码适用于任何响应方法。
2023-08-29 广告
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.