实体头字段
请求消息和响应消息中都可以传递实体信息,实体信息包括实体头字段和实体内容,实体头字段是实体内容的元信息,描述了实体内容的属性,比如实体内容的类型、长度、压缩方法、最后的修改时间、数据的有效期等。接下来,本节将针对实体头字段进行详细地讲解。
1、Allow
Allow头字段指定了请求资源所支持的请求方式(如GET、POST等),用于通知客户端应该严格按照指定的方式请求资源,如下所示:
Allow:GET,HEAD,PUT
需要注意的是,Allow头字段必须和405(Method Not Allowed )响应状态码一起使用。
2、Content-Language
Content-Language用于指定返回网页文档的国家语言类型,其设置值是zh-cn、en-us、ja等国家语言的标准名称。由于同一个字符在不同的国家语言中的样式和意义上能有略微区别,如果一些客户端软件正好要对字符文本按不同的国家语言进行不同处理时,Content-Language头字段就比较重要了。Content-Language的具体示例如下所示:
Content-Language: en-us
3、Content-Length
Content-Length头字段用于表示实体内容的长度(字节数),首先来看一个带有Content-Length头字段的简单的响应消息,具体如下所示:
HTTP/1.1 200 OK
Date: Tue, 21 May 2002 12:34:56 GMT
Content-Length: 109
<html>
<head>
<title>Content-Length Example</title>
</head>
<body>
Content-Length: 109
</body>
</html>
在上面的响应消息中,从<html>中的第一个字符“<”到</hml>中的最后一个字符“>”,内容的长度为109。
在HTTP/1.1中,浏览器与服务器之间保持持久连接,服务器允许客户端在一个TCP连接上发送多个请求,服务器必须在每个响应中发送一个Content-Length响应头来标识各个实体内容的长度,以便客户端能分清每个响应内容的结束位置,而不会将上一个响应和下一个响应混淆。
如果响应消息中包含了Transfer-Encoding响应头,也就是说响应内容以chunked编码方式返回,那么,Content-Length响应头就不应该设置了。
4、Content-Location
Content-Location头字段用于指定响应消息中实体内容的实际位置路径(不能简单地认为响应消息中的实体内容所在的路径就是请求资源的路径),当一个请求资源路径对应有多种实体内容形式时,例如,同一请求资源可能有多个国家语言的版本,每个国家语言的版本都有自己的位置,在这种情况下,请求资源路径与响应的实体内容所在的路径可能是不同的,具体示例如下:
// 请求消息
GET /docs/index.html HTTP/1.1
Host: httpd.apache.org
Accept-Language: en-us
// 响应消息
HTTP/1.1 200 OK
Date: Tue, 21 May 2002 12:34:56 GMT
Server: Apache (Unix)
Content-Location: index_en_us.html
Content-Type: text/html
Content-Language: en-us
在上面的示例中,请求消息中需要请求index.html文档,而且要求是英文文档,服务器中发现有可用的英文文档index_en_us.html,就会在响应消息中将Content-Location消息头的值设置为index_en_us.html文档的路径,并把该文档回送给客户端。
Content-Location的设置值可以是绝对路径,也可以是相对路径,如果是相对路径,则是相对请求资源路径而言的,对于上面的响应消息来说,index.html和index_en_us.html在同一目录下。
5、Content-Range
Content-Range头字段用于指定服务器返回的部分实体内容的位置信息。只有客户机使用了Range请求头要求服务器返回实体的部分内容时,服务器的响应头中才会包含Content-Range头,具体示例如下所示:
HTTP/1.1 206 Partial content
Date: Wed, 15 Nov 1995 06:25:24 GMT
Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
Content-Range: bytes 21010-47021/47022
Content-Length: 26012
Content-Type: image/gif
在Content-Range头字段中,bytes说明后面的数据以byte为单位,21010-47021说明返回的内容从第21010个字节开始到第47021个字节结束,47022说明整个实体内容的大小为47022个字节,从Content-Length头字段可以看出返回的实体内容的长度为26012(47021-21010+1)个字节。
6、Content-MD5
Content-MD5头字段用于提供对实体内容的完整性检查,它的值是对实体内容MD5数字摘要后再进行BASE64编码的结果。
MD5数字摘要算法是一种散列算法,能够通过对一段信息进行运算,产生一个16个字节的数字摘要。如果对输入信息做了任何形式的改变,对改变后的信息再次进行MD5运算所产生的数字摘要和改变之前的数字摘要都不相同。由于通过MD5算法计算的16个字节摘要信息可能无法转化成可打印的ASCII字符显示,因此需要对这16个字节进行BASE64编码,将其转换为可打印的ASCII字符。Content-MD5的头字段如下所示:
Content-MD5: ZTFmZDA5MDYyYTMzZGQzMDMxMmIxMjc4YThhNTMyM2I=
BASE64编码的原理,这里就不再讲解,有兴趣的同学可以查阅相关文档进行学习。
7、Content-Type
Content-Type用于指出实体内容的MIME类型。MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展类型)是一个互联网标准,它设计之初是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。由于通过HTTP协议传输的数据也有各种类型,因此,HTTP也采用了MIME来标识不同的数据类型。客户端通过检查响应头字段Content-Type中的MIME类型,就能知道接收到的实体内容代表哪种格式的数据类型,从而进行正确的处理。
大多数服务器会在配置文件中设置文件扩展名与MIME类型的映射关系,从而可以根据请求资源的扩展名自动确定Content-Type的MIME类型。在Tomcat的web.xml文件中有大量的<mime-mapping>元素,来实现文件扩展名和MIME类型的映射,下面是web.xml文件的片段:
......
<mime mapping>
<extension>pdf</extension>
<mime-type>application/pdf</mime-type>
</mime-mapping>
......
其中<mime- mapping >元素的<extension>子元素用于指定文件的扩展名,<mime-type>子元素用于指定该文件扩展名映射的MIME类型。
MIME类型包含主类型和子类型,两者之间用“/”分隔,上面的文件片段中的MIME类型“application/pdf”,application为主类型,pdf为子类型。MIME类型也可以使用“”号通配符,“*/”代表所有的MIME类型,“image/*”代表所有image的子类型。如果子类型以“x-”开头,则表示该类型目前还处于实验性的阶段。Content-Type头字段中的MIME类型后面还可以指定响应内容所使用的字符码表,两者之间用分号(;)和空格隔开,如:Content-Type:text/html; charset=GB2312。如果Content-Type头字段中没有指定字符码表,默认使用的是ISO-8859-1字符码表。