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。

HTTP - 内容编码的更多相关文章

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

    转自:http://network.51cto.com/art/201509/491335.htm Transfer-Encoding,是一个 HTTP 头部字段,字面意思是「传输编码」.实际上,HT ...

  2. 火狐firefox提示“内容编码错误 无法显示您尝试查看的页面,因为它使用了无效或者不支持的压缩格式。”

    火狐firefox浏览器打开网也是时提示“内容编码错误 无法显示您尝试查看的页面,因为它使用了无效或者不支持的压缩格式.” 今早一来打开用PHPCMS做的网站时就提示这个错误,用其他浏览器打开提示的是 ...

  3. HTTP 内容编码,也就这 2 点需要知道 | 实用 HTTP

    Hi,大家好,我是承香墨影! HTTP 协议在网络知识中占据了重要的地位,HTTP 协议最基础的就是请求和响应的报文,而报文又是由报文头(Header)和实体组成.大多数 Http 协议的使用方式,都 ...

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

    #以后的知识都是HTTP协议的扩展,如果精力有限可以选择暂时忽略,注意只是暂时忽略,以后的东西同样重要 HTTP传输数据时可以直接传输也可以对数据进行编码,由于编码在计算机内运行,所以会占用一些CPU ...

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

    核心用到的是mb_convert_encoding函数,示例代码如下: <?php header("Content-type: text/html; charset=utf-8&quo ...

  6. python中的内容编码

    一.python编码简介 1)编码格式简介 python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ASCII),ASCII(American Standard Code for In ...

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

    @ResponseBody 在@Controller 类方法中能够让字符串直接返回内容. 其返回处理的类是org.springframework.http.converter.StringHttpMe ...

  8. hbase中文内容编码转换

    /** * HBASE中文转换 */ @Test public void testHbaseStr() throws Exception { // Hbase UTF8编码 String conten ...

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

    1利用jquery /** JQuery Html Encoding.Decoding * 原理是利用JQuery自带的html()和text()函数可以转义Html字符 * 虚拟一个Div通过赋值和 ...

随机推荐

  1. c#重载和重写及运用

     重载的条件:           1.必须在同一个类中2.方法名必须相同3.参数列表不能相同.   重写的条件:          1. 在不同的类中          2. 发生方法重写的两个方法 ...

  2. 十四、Android学习笔记_Android回调函数触发的几种方式 广播 静态对象

    一.通过广播方式: 1.比如登录.假如下面这个方法是外界调用的,那么怎样在LoginActivity里面执行登录操作,成功之后在回调listener接口呢?如果是平常的类,可以通过构造函数将监听类对象 ...

  3. Part 11 Search filter in AngularJS

    As we type in the search textbox, all the columns in the table must be searched and only the matchin ...

  4. javascript中的闭包。

    function todo() { var var1 = 1; (function () { var var2 = var1 + 1; alert(var2); })(); } todo(); (fu ...

  5. apache Internal Server Error 的几个问题

    Internal Server Error The server encountered an internal error or misconfiguration and was unable to ...

  6. 建立临时的表 数据 空值 与 NULL 转换

    if exists ( select * from INFORMATION_SCHEMA.tables where table_name = 'Config_Order_ChargesToPreVie ...

  7. ACCESS的System.Data.OleDb.OleDbException: INSERT INTO 语句的语法错误

    一直用的是SQL 数据库,突然改用Access了,使用起来就是没有SQL 顺畅,老是出来些意想不到的错误.今天用Access做的网站程序进行添加数据,调试了一下午,总是异常…… 提示ACCESS的Sy ...

  8. 20141211—C#面向对象,封装

    封装 一个private 的变量.在变量名上右键-重构-封装字段 小建议:在创建封装字段的时候,在名字前加 “_”用以区分. 封装时,下划线会自动去除 点击确定后: 应用: 赋值的时候走 set 取值 ...

  9. 7款经典炫酷的HTML5/jQuery动画应用示例及源码

    jQuery是一款普遍受前端开发者欢迎的Javascript框架,但是开发者貌似更关注jQuery开发的插件,海量的jQuery插件让前端开发者非常方便.HTML5的加入让jQuery这个家族更加丰富 ...

  10. call与apply函数

    call与apply函数 1.为什么需要call与apply函数 Javascript中,每一个函数内部都有一个特殊的关键词this,其随着所处环境的不同其指向也是不同的. 函数的内部其this也是指 ...