HTTP - 内容编码

HTTP 应用程序有时在发送之前需要对内容进行编码。例如,在把很大的 HTML 文档发送给通过慢速连接上来的客户端之前,服务器可能就会对它进行压缩,这样有助于减少传输实体的时间。

内容编码过程

内容编码的过程如下所述。

  1. 网站服务器生成原始响应报文,其中有原始的 Content-Type 和 Content-Length 首部。
  2. 内容编码服务器(也可能就是原始的服务器或下行的代理)创建编码后的报文,编码后的报文有同样的 Content-Type 但 Content-Length 可能不同(比如主体被压缩了)。内容编码服务器在编码后的报文中增加 Content-Encoding 首部,这样接收的应用程序就可以进行解码了。
  3. 接收程序得到编码的报文,进行解码,获得原始报文。

内容编码类型

HTTP 定义了一些标准的内容编码类型,并允许用扩展编码的形式增添更多的编码。由互联网号码分配机构(IANA)对各种编码进行标准化,它给每个内容编码算法分配了唯一的代号。Content-Encoding 首部就用这些标准化的代号来说明编码时使用的算法。

下表列出了一些常用的内容编码代号:

  描述
 gzip  表明实体采用 GNU zip 编码 
 compress   表明实体采用 Unix 的文件压缩程序 
 deflate  表明实体采用 zlib 的格式压缩 
 identity  表明没有对实体进行编码。当没有 Content-Encoding 首部是,就默认为这种情况 

gzip、compress 以及 deflate 编码都是无损压缩算法,用于减少传输报文的大小,不会导致信息损失。这些算法中,gzip 通常是效率最高的,使用最为广泛。

Accept-Encoding 首部

我们不希望服务器用客户端无法解码的方式来对内容进行编码。为了编码服务器使用客户端不支持的编码方式,客户端就把自己支持的内容编码方式列表放在请求的 Accept-Encoding 首部,服务器就可以假设客户端能够接受任何编码方式(等价于发送 Accept-Encoding: *)。

内容编码与 Content-Length

如果主体进行了内容编码,Content-Length 首部说明的就是编码后(encoded)的主体的字节长度,而不是未编码的原始主体长度。下面的示例说明了这个问题。

1. 在 Servert 中,使用 gizp 对响应内容进行压缩。

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    try {
        String data = "abcdefghijklmnopqrstuvwxyz\r\n"
                + "abcdefghijklmnopqrstuvwxyz\r\n"
                + "abcdefghijklmnopqrstuvwxyz\r\n"
                + "abcdefghijklmnopqrstuvwxyz\r\n"
                + "abcdefghijklmnopqrstuvwxyz\r\n";

        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        GZIPOutputStream gout = new GZIPOutputStream(bout);
        gout.write(data.getBytes());
        gout.close();

        byte compressedData[] = bout.toByteArray();
        resp.setHeader("Content-Encoding", "gzip");
        resp.getOutputStream().write(compressedData);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

2. 发送请求,查看响应报文。从下面的请求结果可以看出,浏览器对编码过的内容进行解码再显示出来,而 Content-Length 的值也不是原来内容的长度 140,而是编码后内容的长度 51。

时间: 2024-08-09 21:59:50

HTTP - 内容编码的相关文章

JS及JQuery对Html内容编码,Html转义

/** JQuery Html Encoding.Decoding * 原理是利用JQuery自带的html()和text()函数可以转义Html字符 * 虚拟一个Div通过赋值和取值来得到想要的Html编码或者解码 */ <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script> <script type="text/javascript"> //Ht

HTTP 协议中的 Content-Encoding 和 Transfer-Encoding(内容编码和传输编码)

转自:http://network.51cto.com/art/201509/491335.htm Transfer-Encoding,是一个 HTTP 头部字段,字面意思是「传输编码」.实际上,HTTP 协议中还有另外一个头部与编码有关:Content-Encoding(内容编码).Content-Encoding 通常用于对实体内容进行压缩编码,目的是优化传输,例如用 gzip 压缩文本文件,能大幅减小体积.内容编码通常是选择性的,例如 jpg / png 这类文件一般不开启,因为图片格式已

内容编码

•内容编码 HTTP应用程序有时在发送之前需要对内容进行编码. •内容编码过程: 1)网站服务器生成原始响应报文,其中有原始的Content-Type和Content-Length首部. 2)内容编码服务器创建编码后的报文.编码后同样有Content-Type和Content-Length.内容编码服务器在编码后的报文中增加Content-Encoding首部,这样接收的应用程序就可以进行解码了. 3)接收程序得到编码后的报文,进行解码,获得原始报文. 在这个例子中,通过gzip内容编码函数对H

#WEB安全基础 : HTTP协议 | 0x10 扩展HTTP报文结构概念和内容编码

#以后的知识都是HTTP协议的扩展,如果精力有限可以选择暂时忽略,注意只是暂时忽略,以后的东西同样重要 HTTP传输数据时可以直接传输也可以对数据进行编码,由于编码在计算机内运行,所以会占用一些CPU资源 报文(message):HTTP通信的基本单位,由八位组字节(由八个bit组成的一字节)流组成通过HTTP通信传输 实体(entity):作为请求或响应的有效载荷数据被传输,其内容由实体首部和实体主体组成 HTTP报文的主体用于传输请求和下响应的实体主体.通常,报文主体等于实体主体,只有当传输

python中的内容编码

一.python编码简介 1)编码格式简介 python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ASCII),ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号.显然ASCII码无法将世界上的各种文字和符号全部表

php检测文件内容编码的方法

核心用到的是mb_convert_encoding函数,示例代码如下: <?php header("Content-type: text/html; charset=utf-8"); /** * 获取内容的编码 * @param string $str */ function get_encoding($str = "") { $encodings = array ( 'ASCII', 'UTF-8', 'GBK' ); foreach ( $encoding

Spring mvc 注解@ResponseBody 返回内容编码问题

@ResponseBody 在@Controller 类方法中可以让字符串直接返回内容. 其返回处理的类是org.springframework.http.converter.StringHttpMessageConverter,此类默认编码 <span style="font-size:18px;">public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");&

小哈学Python第三课-字符集编码

table.hovertable { font-family: verdana, arial, sans-serif; font-size: 11px; color: #333333; border-width: 1px; border-color: #999999; border-collapse: collapse } table.hovertable th { background-color: #c3dde0; border-width: 1px; padding: 8px; borde

linux下查看文件编码及修改编码

http://blog.csdn.net/jnbbwyth/article/details/6991425 查看文件编码在Linux中查看文件编码可以通过以下几种方式:1.在Vim中可以直接查看文件编码:set fileencoding即可显示文件编码格式.如果你只是想查看其它编码格式的文件或者想解决用Vim查看文件乱码的问题,那么你可以在~/.vimrc 文件中添加以下内容: set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936 这样,就可以