|
HTTP协议详解
一、 了解HTTP协议
1. HTTP简介
WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议。
HTTP是超文本传输协议(hypertext transfer protocal)的简写,是TCP/IP协议的应用层的协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程以及数据本身的格式。
HTTP协议的版本
HTTP/1.0 HTTP/1.1 HTTP/N-G
2. HTTP/1.0的会话方式
浏览器与WEB服务器连接的时间是短暂的,每次连接只处理一个请求和响应。对每一个页面的访问,浏览器与WEB服务器都要建立一次单独的连接。
浏览器到WEB服务器之间的每次请求都是完全独立分开的请求对。
支持代理服务器(可以有效减轻服务器的压力,但是要注意缓存中页面的有效期):
3. 浏览器访问多图网页的过程
4. HTTP/1.1与HTTP/1.0的比较
HTTP/1.1的特点
在一个TCP连接上可以传送多个HTTP请求和响应
多个请求和响应过程可以重叠进行。
增加了更多请求头和响应头。
5. HTTP请求信息
请求消息的结构:
一个请求行、若干消息头、以及实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。
6. HTTP响应信息
响应信息的结构:
一个状态行、若干消息头、以及实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。
7. HTTP消息其它细节
响应消息的实体内容就是网页文件的内容,也就是在浏览器中使用查看源文件的方式所看到的内容。
一个使用GET方式请求消息中不能包含实体内容,只有使用POST、PUT、DELETE方式的请求消息中才可以包含实体内容。
对于HTTP 1.1来说,如果HTTP消息中包含实体内容,且没有采用chunked传输编码方式,那么消息头部分必须包含内容长度的字段,否则,客户和服务程序就不知道实体内容何时结束。
在HTTP协议中,还可以使用简单的请求信息和响应信息,它们都没有消息头部分。简单的请求消息只能使用GET方式,且请求行中不用指定HTTP协议版本号,对于简单的请求消息,服务器返回简单的响应消息,简单的响应消息中只返回实体内容。
8. HTTP消息头
使用HTTP消息头,可以实现HTTP客户机和服务器之间的条件请求和应答,消息头相当于服务器和浏览器之间的一些暗号指令。
每个消息头包含一个头字段名称,容纳后依次是冒号、空格、值、回车和换行符。例如:Accept-Language: en-us
消息头字段名是不区分大小写的,但是习惯上将每个单词的第一个字母大写。
整个消息头部分中的各行消息头可按任意顺序排列。
消息头又可以分为通用信息头、请求头、响应头、实体头等四类。
许多请求头字段都同意客户端在值部分指定多个可接受的选项,多个选项之间以逗号分隔。如:Accept-Encoding:gzip, compress
有些字段可以出现多次,例如,响应信息中可以包含有多个“warning”头字段。
9. 实例讲解
二、 请求行与状态行
1. 请求行与状态行
1) 请求行
格式:请求方式 资源路径 HTTP版本号<CRLF>
举例:GET /test.HTML HTTP/1.1
请求方式:POST HEAD OPTIONS DELETE TRACE PUT
2) 状态行
格式:HTTP版本号 状态吗 原因叙述<CRLF>
举例:HTTP/1.1 200 OK
实例:启动Tomcat,在命令行中输入:telnet localhost 8080,连接服务器。然后如图所示:
2. 使用GET和POST方式传递参数
1) 在URL地址后面可以附加一些参数
举例:http://www.baidu.com/servlet/Par ... =abc&param2=xyz
2) GET方式
举例:GET /Servlet/ParamsServlet?param1=abc&param2=xyz HTTP/1.1
特点:传送的数据量是有限制的,一般在1KB一下。
3) POST方式
举例:POST /servlet/ParamsServlet HTTP/1.1
Host:
Content-Type:application/x-www-form-urlencoded
Content-Length:28
Param1=abc&param2=xyz
特点:传送的数据量要比GET方式大得多。
3. 响应状态吗
1) 响应状态码用于表示服务器对请求的各种不容处理结果和状态,它是一个三位的十进制数。响应状态码为5中类别,使用最高位为1到5来进行分类:
2) 响应状态码-》特殊情况
三、 通用信息头
1. 通用信息头
通用信息头字段既能用于请求消息,也能用于响应消息,它包括一些与被传输的实体内容没有关系的常用消息头字段。
Cache-Control: no-cache (*)
Connection: close (*)
Date: tue, 11 Jul 2000 18:23:51 GMT
Pragma: no-cache (*)
Trailer: Date
Transfer-Encoding: chunked (*)
Upgrade: HTTP/2.0,SHTTP/1.3
Via: HTTP/1.1 Proxy1,HTTP/1.1 Proxy2
Warning: any text
比如股票信息要实时信息,不能有缓存。
四、 请求头
1. 请求头字段用于客户端在请求消息中向服务器传递附件信息,主要包括客户端可以接受的数据类型、压缩方法、语言、以及发出请求的超链接所属网页的URL地址等信息。
Accept: text/html,image/* (*)
Accept-Charset: ISO-8859-1,Unicode-1-1 (*)
Accept-Encoding: gzip,compress (*)
Accept-Language: en-gb,zh-cn (*)
Authorization: Basic enh4OjEyMzQ1Ng== (*)
Expect: 100-continue
From: zxx@126.com
Host: www.baidu.com:80 (*)
If-Match: “xyzzy”,”r2d2xxx”
2. If-Modified-Since: Tue,11 Jul 2000 18:23:51 GMT (*)
If-None-Match: “xyzzy’,”r2de2xxx”
If-Range: Tue,11 Jul 2000 18:23:52 GMT
If-Unmodified-Since: Tue 11 Jul 2000 18:23:23 GMT
Max-Forwards: 1
Proxy-Authorization: Basic enh4OjEyMzQ1Ng==
Range: bytes=100-599 [bytes=100-] [bytes=-100] (*)
Referer: http://www.baidu.com (*)
TE: trailers,deflate
User-Agent: Mozilla/4/0(compatible; MSIE5.5;Windows NT-5.0) (*)
五、 响应头
六、 实体头
1. 实体头用作实体内容的元信息,描述了实体内容的属性,包括实体信息类型、长度、压缩方法、最后一次修改时间、数据有效期等。
Allow: GET POST
Content-Encoding: gzip (*)
Content-Language: zh-cn
Content-Length: 80
Content-Location: http://www.baidu.com/index.html
Content-MD5: ABCDKJFAKLDJFLKDJFLKDSJFL==
Content-Range: text/html;charset=GB2312
Expires: Tue,11 Jul 2000 18:23:51 GMT
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT
七、 扩展头
1. 在HTTP消息中,也可以使用一些在HTTP 1.1正式规范里没有定义的头字段,这些头字段统称为自定义的HTTP头或者扩展头,它们通常被当做是一种实体头处理。
2. 现在流行的浏览器实际上都支持Cookie,Set-Cookie,Refresh,Content-Dispositon等几个常用的扩展头字段。
Refresh头字段:
Refresh: 1
Refresh: 1;url=http://www.baidu.com
Content-Disposition头字段:
Content-Type: application/octet-stream
Content-Disposition: attachment; filename=aaa.zip
对于Java Web 编程来说,最核心的是要熟悉和掌握HTTP协议,这个就和java无关了,在熟悉HTTP协议之后,就需要熟悉Java的实现HTTP协议的类库,也就是Servlet API,所以最重要的东西就是Servlet API。当然对于初学者而言,直接通过Servlet API来学习Web编程有很大的难度,我推荐O′reilly的《Java Server Pages 》这本书来学习Web 编程。 |
|