3.HTTP响应

HTTP 响应消息

1.总体结构

 - 状态行              //  HTTP/1.1  200 OK
 - 头部字段(一个或者多个)
 - 空白行  //空白行的作用是来通知服务器,它已经结束了该头信息的发送。
 - 消息主题(可选)
状态行:有3个部分组成
1.在格式化响应时服务器软件使用的 HTTP 版本
2.一个数字状态码,指示响应类型
3.一个文本字符串(原因短语,reson phrase),以人类可读的形式来表示通过数字状态码表示的信息。
如,200,OK 这个状态码指示服务器没有检测到任何错误。
具有这个状态码的响应主体中应该包含客户请求的资源。

2.状态码

所有的状态码都由 3 位十进制数字组成。
第一位数字表示状态码的一般类别。
状态码的后面两位数定义了指定类别中的特定的状态。
HTTP 标志建议了所有状态码的原因短语,
但是服务器可能使用一个备用且等价的短语。
所有的状态码和原因短语都包含在[RRFC-2616]中。

HTTP/1.1 状态码类别


 数字      类别            标志用法
 1.   Infomational        在完成请求处理之前,提供信息给客户  
 2.   Success             成功的处理了请求
 3.   Redirection         客户需要使用不同的资源来完成请求
 4.   Client Error        客户的请求无效
 5.   Server Error        在服务器处理有效的客户请求期间发生错误

常见的 HTTP/1.1 状态码

状态码  建议的原因短语         通常的含义
200    OK                   正常处理请求
301    Moved Permanently    所请求资源的URI发生变化。所有将来的请求都应该发往响应的 
                           Location 头部字段中包含的URI。
                           大多数浏览器将自动把第二个请求发送给新的URI,并显示第二个响应。
307    Temporary            所请求资源的URI至少暂时发生了变化。应该
                            通过响应的Location 头部字段中包含的URI发送第二个请求来完成这个请求。
                            大多数浏览器自动把第二个请求发送给新的URI,并显示第二个响应。  
401    Unauthorized        资源受密码保护,用户还没有提供一个有效的密码
403    Forbidden           资源在服务器上,但是被保护起来不让阅读(通常表示服务器管理员方面出现错误,
                          但有可能是有意而为之)
404    Not Found           在这个服务器上没有找到与给定的请求URI对应的资源
500    Internal Server Error  服务器软件检测到一个内部失败

3.响应头部字段
这里写图片描述


4.缓存控制

在计算机系统中,缓冲(cache)是源于别处的信息副本的存储库。
将信息的副本放在缓存中,以改善系统的性能。

例如,大多数个人计算机系统使用一个较小的高速缓存来保存 
RAM 内存中包含的一些数据副本,RAM 内存比缓存要慢一些。

大多数 web 浏览器自动在客户机上缓冲通过 HTTP 从服务器请求的许多资源。如,
如果 web 页面包含一副图像(如一个按钮图像),从服务器获取的图像的副本通常将缓存在
客户机的文件系统上。
这样,如果同一个站点上的另外一个页面使用相同的图像,就可以从客户文件系统中检索这副图像,
而无需发送另外一个 HTTP 请求给服务器,并等待包含该图像的服务器的响应。 HTTP 缓存成功时,
一般会导致浏览器更快的显示内容,减少网络通信,以及减少 web 服务器上的负载。

不过,缓存有一个至关重要的缺点:缓冲中的信息可能变得无效(invalid)。如,
如果在服务器上面修改了上面的按钮图像,但是客户仍然访问器缓存的图像老版本的副本,
那么客户讲显示一个无效的图像版本。可以用很多方式避免这个问题。

用于保证资源的缓存副本有效的一种方法是:让客户询问服务器客户的副本是否有效。
可以使用 HEAD 方法发送一个对该资源的 HTTP 请求,利用相对较少的通信来完成这个任务,
它只会返回响应的状态行和头部。
如果响应消息包含一个 Last-Modifed 时间,并且这个时间在  利用缓存资源返回的 Date 头部的字段的值  之前,
那么缓存的副本仍然有效,并且可以使用它。
否则,缓存的副本是无效的,浏览器应该发送一个对该资源的正常的 GET 请求。

如果服务器返回一个带有该资源的 ETag ,则可以使用一种稍微简单的方法。然后,
客户可以简单的比较由  HEAD 请求返回的 ETag 与利用缓存资源存储的 ETag 。如果这 2 个 ETag 值匹配,
那么缓存的副本就是有效的;否则,它就是无效的。
这种方法避免了比较两个日期以确定哪个日期更新一些的复杂情况。

最后,如果服务器可以提取确定响应发送变化的最早时间,服务器就可以在一个 Expires 头部字段中返回那个时间。
在这种情况下,只要还没有到 Expires 时间的,客户就可以利用资源的缓存副本,而无需服务器检验。
如果响应中未包含 Expires 时间,浏览器可以使用一个启发式算法来选择一个到期时间,然后就像在一个 Expires 头部字段中,
传递了这个时间一样工作。可以通过发送一个位于 Date 值(值 0 通常用于这种目的)
之前的 Expires 时间来阻止这种行为。
如果完成工作,那么每次访问资源之前,遵守 HTTP/1.1的浏览器都将执行验证。 

5.字符集

如何在 web 文档中表示字符。

在计算机内部,用整数值表示字符。

字符集(character set)定义了这些整数(或码点(code point))与字符之间的映射。例如,
US-ASCII[RFC-1345]是一种字符集,用于表示 HTTP 头部字段名称中使用的字符,
也用在其他许多 Internet 协议的关键部分中。每个 US-ASCII 字符都可以用一个 7 位整数来表示,
这样做很方便,这部分是由于通过 IP 协议传输的消息被看作 8 位字节流,
因此可以用单独一个字节来表示每个字符。

缺点是:US-ASCII 字符集并未包含现代语言中许多常用的字符。

Unicode 标志尝试提供单个字符集,它纳入了每一种人类语言表示法及其所有其他常用的符号。 
Unicode 标志的 BMP( basic multilingual plane)涵盖了每一种现代语言中大多数常用字符,
它使用 16 位字符代码,并且 Unicode 标准的整个字符代码空间扩展到了 
21 位整数。

当然,如果客户请求的资源是使用 US-ASCII 字符集编写的,
那么对于服务器传输到客户的每个字符都要发送 21 位,这相当于发送 ASCII 字符长度的 3 倍,
因此,出于效率和兼容性起见,大多数浏览器除了接受 Unicode 中的那些字符集之外,
还接受其他的字符集。参见[IANA-CHARSETS].

更一般的讲,除了多种字符集外,大多数浏览器还接受某些字符编码。字符编码(character encoding)是一个位串,
它必须被解码成一个码点整数,然后根据某个字符集中提供的定义将其映射到一个字符。
字符串编码通常使用变长的位串来表示字符,一般使用较短的字符串表示字符,而使用较长的字符串表示不常见的字符。
如,UTF-8 和 UTF-16 都是 Unicode 中字符集的编码方式,它们使用 8 位 和 16 位可变数值来编码所有可能的 
Unicode 标志字符(不要混洗字符编码与之前提到的消息编码概念。消息编码通常涉及对应消息的主体应用一个通用的压缩算法,
而不管使用的字符编码是什么)。

客户使用 Accept-Charset 头部字段来告诉服务器它将接受的 字符集 和 字符编码,
如果请求文档可以使用不止一种字符集或编码方式,则还会告诉服务器它首选的字符集或编码方式。如下:
accept-charset: ISO-8859-1, utf-8 ; q=0.7,* ; q=0.7

指出客户将优先使用 ISO-8859-1 字符集 或者 Unicode 中的字符 UTF-8编码来接受文档,
但是它也会接受其他任何有效的 Internet 字符集/编码( ISO-8859-1 是 US-ASCII 的一个 8 位超集,
其中包含基于拉丁语的语言(而不是英语)中的许多字符。客户讲优先选择 ISO-8859-1 和 UTF-8,
即使它们具有与 * 相同的质量值也是如此,因为赋予特定的字段值的优先级将超过 * 通配符)

web 服务器可以通过 Content-Type 头部字段的值中添加一个 charset 参数,来通知客户在返回的文档中使用的字符集/编码。
例如,HTTP 响应中如下所示的 Content-Type 头部字段指示消息主体是一个 HTML 文档,
它使用 UTF-8 字符编码编写而成的:
Content-Type:text/html;charset=UTF-8

US-ASCII 字符集同时是 ISO-8859-1 字符集合 UTF-8 字符编码的子集,因此,对于许多 US-ASCII 文档,
都把 charset 参数设置成这 2 个值之一,以确保国际兼容性。

http://www.cnblogs.com/hackpig/archive/2010/02/14/1668282.html

http://kb.cnblogs.com/page/130970/

缓存:
http://www.cnblogs.com/tyb1222/archive/2011/12/24/2300246.html

http://www.cnblogs.com/52linux/archive/2012/04/26/2470865.html

字符集:
http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html

http://os.51cto.com/art/201503/467929.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值