3.4 HTTP 状态码
来源:互联网 发布:c语言生日祝福 编辑:程序博客网 时间:2024/06/05 09:03
状态码分类:
1. 100~199——信息性状态码
- HTTP/1.1 向协议中引入了信息性状态码。这些状态码相对较新,关于其复杂性和感知价值存在一些争论,而受到限制。
- 已定义的信息性状态码:
- 100 Continue 状态码尤其让人糊涂。它的目的是对这样的情况进行优化:HTTP 客户端应用程序有一个实体的主体部分要发送给服务器,但希望在发送之前查看一下服务器是否会接受这个实体。这可能会给 HTTP 程序员带来一些困扰,因此在这里进行了比较详细(它如何与客户端、服务器和代理进行通信)的讨论。
1. 客户端与100 Continue
- 如果客户端在向服务器发送一个实体,并且愿意在发送实体之前等待 100 Continue响应,那么,客户端就要发送一个携带了值为 100 Continue 的 Expect 请求首部。
- 如果客户端没有发送实体,就不应该发送 100 Continue Expect 首部,因为这样会使服务器误以为客户端要发送一个实体。
- 从很多方面来看,100 Continue 都是一种优化。客户端应用程序只有在为了避免向服务器发送一个服务器无法处理或使用的大实体时,才应该使用 100 Continue。
- 由于起初对 100 Continue 状态存在一些困惑(而且以前有些实现在这里出过问题),因此发送了值为 100 Continue 的 Expect 首部的客户端不应该永远在那儿等待服务器发送 100 Continue 响应。超时一定时间之后,客户端应该直接将实体发送出去。
- 实际上,客户端程序的实现者也应该做好应对非预期 100 Continue 响应的准备(这很烦人,但确实如此)。有些出错的 HTTP 应用程序会不合时宜地发送这个状态码。
2. 服务器与100 Continue
- 如果服务器收到了一条带有值为 100 Continue 的 Expect 首部的请求,它会用 100 Continue 响应或一条错误码来进行响应。
- 服务器永远也不应该向没有发送 100 Continue 请求的客户端发送 100 Continue 状态码。但如前所述,有些出错的服务器可能会这么做。
- 如果出于某种原因,服务器在有机会发送 100 Continue 响应之前就收到了部分(或全部)的实体,就说明客户端已经决定继续发送数据了,这样,服务器就不需要发送这个状态码了。但服务器读完请求之后,还是应该为请求发送一个最终状态码(它可以跳过 100 Continue 状态)。
- 最后,如果服务器收到了带有 100 Continue 期望的请求,而且它决定在读取实体的主体部分之前(比如,因为出错而)结束请求,就不应该仅仅是发送一条响应并关闭连接,因为这样会妨碍客户端接收响应。
3. 代理与100 Continue
- 代理从客户端收到了一条带有 100 Continue 期望的请求,它需要做几件事情:
- 如果代理知道下一跳服务器(在第 6 章中讨论)是 HTTP/1.1 兼容的,或者并不知道下一跳服务器与哪个版本兼容,它都应该将 Expect 首部放在请求中向下转发。
- 如果代理知道下一跳服务器只能与 HTTP/1.1 之前的版本兼容,就应该以 417 Expectation Failed 错误进行响应。(还有一种合理的方法,是向客户端先返回 100 Continue,在向服务器转发请求时,删掉 Expect 首部。)
- 如果代理决定代表与 HTTP/1.0 或之前版本兼容的客户端,在其请求中放入 Expect 首部和 100 Continue 值,那么,(如果它从服务器收到了 100 Continue 响应)它就不应该将 100 Continue 响应转发给客户端,因为客户端可能不知道该拿它怎么办。
- 代理维护一些有关下一跳服务器及其所支持的 HTTP 版本的状态信息(至少要维护那些最近收到过请求的服务器的相关状态)是有好处的,这样它们就可以更好地处理收到的那些带有 100 Continue 期望的请求了。
2. 200~299——成功状态码
- 已定义的成功状态码:
这种响应码并不是非用不可的,如果实体首部来自源端服务器,响应为 200 状态的应用程序就可以将其作为一种可选项使用 204 No Content(没有内容) 响应报文中包含若干首部和一个状态行,但没有实体的主体部分。主要用于在浏览器不转为显示新文档的情况下,对其进行更新(比如刷新一个表单页面) 205 Reset Content(重置内容) 另一个主要用于浏览器的代码。负责告知浏览器重置当前页面中的所有 HTML 表单元素. 206 Partial Content(部分内容) 成功执行了一个部分或 Range(范围)请求。稍后我们会看到,客户端可以通过一些特殊的首部来获取部分或某个范围内的文档——这个状态码就说明范围请求成功了。
206 响应中必须包含 Content-Range、Date 以及 ETag 或 Content-Location 首部。
3. 300~399——重定向状态码
- 已定义的重定向状态码:
- 重定向状态码要么告知客户端使用替代位置来访问他们所感兴趣的资源,要么就提供一个替代的响应而不是资源的内容。如果资源已被移动,可发送一个重定向状态码和一个可选的 Location 首部来告知客户端资源已被移走,以及现在可以在哪里找到它。这样,浏览器就可以在不打扰使用者的情况下,透明地转入新的位置了。
- 可以通过某些重定向状态码对资源的应用程序本地副本与源端服务器上的资源进行验证。比如,HTTP 应用程序可以查看其资源的本地副本是否仍然是最新的,或者在源端服务器上资源是否被修改过。
- 总之,在对那些包含了重定向状态码的非 HEAD 请求进行响应时,最好要包含一个实体,并在实体中包含描述信息和指向(多个)重定向 URL 的链接。
4. 400~499——客户端错误状态码
- 已定义的客户端错误状态码:
如果代理或其他中间应用程序有确切证据说明源端服务器会为某请求产生一个失败的期望,就可以发送这个响应状态码。
5. 500~599——服务器错误状态码
- 已定义的服务器错误状态码:
阅读全文
0 0
- 3.4 HTTP 状态码
- HTTP-HTTP状态码
- 【HTTP】HTTP状态码
- HTTP:HTTP状态码
- HTTP就绪状态和HTTP状态码
- Http状态码
- HTTP所有状态码
- http状态码列表
- HTTP协议状态码
- http状态码列表
- http状态码
- HTTP全部状态码
- HTTP状态码
- Http状态码含义
- HTTP状态码
- HTTP 协议状态码
- http状态码一览表
- http状态码一览表
- JavaSE基础之创建对象内存图
- caffe +windows+无GPU+VS2013配置(C++和MATLAB)
- 数据库篇之SQL基础语句
- 无法解析NDIS的Ndis.lib库函数的问题
- effective java(19) 之接口只用于定义类型
- 3.4 HTTP 状态码
- 项目上传到linux上连接数据库失败
- gensim导入问题
- HDU 5988 最小费用最大流
- 带属性的自定义标签
- 多线程基础
- 数据库之SQL语句表记录篇
- Emacs单实例快速启动
- Spring的5中配置方法