1.2 Web的工作原理
在使用B/S架构模式进行Web开发时,浏览器向Web服务器发送一个请求,Web服务器会对请求做出处理,并将处理结果返回给客户端。在这个交互过程中,数据的传输需要遵循HTTP协议。
1.2.1 HTTP协议
HTTP是Hypertext Transfer Protocol的缩写,即超文本传输协议,是浏览器与Web服务器进行数据交互时需要遵守的规范。当客户端与服务器端建立连接后,客户端就可以向服务器端发送URL(Uniform Resource Locator,统一资源定位符)请求,这个过程被称为HTTP请求,服务器端在接收到请求后会做出响应,这个过程被称为HTTP响应。客户端与服务器端基于HTTP协议的交互过程如图1-3所示。
图1-3 客户端与服务器端基于HTTP协议的交互过程
基本运行过程如下。
(1)当客户端向服务器端发送请求时,服务器端会开启一个新的连接,通过这个连接,客户端可以将HTTP请求传送给服务器端。
(2)当服务器端收到HTTP请求时,将对该HTTP请求进行解析与处理,并将处理结果包装成HTTP响应。
(3)服务器端会将HTTP响应传送给客户端,当客户端接收到HTTP响应时,服务器端就会关闭这个连接。
1.2.2 HTTP报文格式
当用户在浏览器中访问某个网址、单击某个链接或提交网页上的表单时,浏览器会向服务器端发送请求数据,即HTTP请求报文。服务器端接收到请求数据时,会将处理后的数据传送给客户端,即HTTP响应报文。HTTP请求报文和HTTP响应报文统称为HTTP报文。
1.HTTP请求报文
在HTTP中,一个完整的HTTP请求报文由3个部分组成:请求行、请求头、请求正文,如图1-4所示。
图1-4 HTTP请求报文
(1)请求行。
请求行位于请求报文的第一行,它由请求方式、资源路径(URL)和所使用的HTTP版本(协议版本)三个部分组成,格式如下。
对于图1-4中的GET/index.html HTTP/1.1,GET是请求方式,index.html是请求资源路径,HTTP/1.1是通信使用的HTTP协议版本。注意请求行中的每个部分均用空格分隔,以回车换行结束。常用请求方式有GET、POST、HEAD、OPTIONS、PUT、DELETE、TRACE和CONNECT共8种,每种方式都指明了操作服务器中指定的URI资源的方式,HTTP的常用请求方式如表1-1所示。
表1-1 HTTP的常用请求方式
①URI(Uniform Resource Identifier)即统一资源标识符,用来表示Web上的每种可用资源。
(2)请求头。
在HTTP请求报文中,在请求行之后便是若干请求头。请求头主要用于向服务器端传递附加消息,如客户端可以接收的数据类型、压缩方法、语言及发送请求的超链接所属页面的URL地址等信息。请求头由一个头字段名称和一个值构成,头字段名称和值之间用冒号(:)和空格分隔,格式如下。
需要注意的是,头字段名称不区分大小写,但习惯上将单词的首字母大写。常用的请求头字段如表1-2所示。
表1-2 常用的请求头字段
续表
2.HTTP响应报文
当Web服务器收到浏览器的请求后,会将响应报文传给浏览器。一个完整的响应报文由3个部分组成:响应状态行、响应头、响应实体,如图1-5所示。
图1-5 HTTP响应报文
(1)响应状态行。
响应状态行位于响应报文的第一行,它包含3个部分,即HTTP版本(协议版本)、一个表示成功或错误的整数代码(状态码),以及对状态码进行描述的文本信息(状态码描述)。格式如下。
对于图1-5中的HTTP/1.1 200 OK,HTTP/1.1是通信使用的协议版本,OK是状态描述(说明客户端请求成功),200是状态码。需要注意的是,请求行的每个部分都要用空格分隔,最后以回车换行结束。
响应状态行中的状态码通常由3位数字组成,表示请求是否被处理,第一个数字定义了响应的类别,如1表示请求已接收,需要继续处理;2表示请求已成功被服务器接收、理解并接受;3表示要完成请求,需要客户端进一步操作,通常用来重定向;4表示客户端的请求有错误;5表示服务器端出现错误。常用的状态码如表1-3所示。
表1-3 常用的状态码
续表
(2)响应头。
在HTTP响应报文中,在响应状态行之后便是若干响应头。服务器端通过响应头向客户端传递附加信息,包括服务程序名、被请求资源需要的方式、客户端请求资源的最后修改时间、重定向地址等。当服务器端向客户端回送响应消息时,根据情况不同,发送的响应头也不相同,常用的响应头字段如表1-4所示。
表1-4 常用的响应头字段
(3)响应实体。
响应实体用于存放需要返回给客户端的数据信息。
在客户端和服务器端之间进行请求和响应时,两种常用方法是GET方法和POST方法。GET方法用于从指定的资源中请求数据;POST方法用于向指定的资源提交要被处理的数据。
1.2.3 GET方法
当客户端要从服务器端读取文档时,使用GET方法。使用GET方法时,请求的参数和对应的值被附加在URL地址后面,一起被发送到服务器端。举例如下。
从这个例子中我们可以看到,问号(?)代表URL的结尾与请求参数的开始,参数由参数名和参数值组成,中间用等号(=)连接。如果有多个参数,参数之间用&分隔。因此,GET方法在通过URL提交数据时,数据在URL中是可以被看到的,若用户输入的数据是非敏感数据,则可以使用GET方法。
当浏览器向Web服务器发送请求时,上述URL的参数部分会附加在需要访问的URI资源后面,如GET/test/form.jsp?id=1001&name=zhang HTTP/1.1。
GET方法的特点如下。
(1)以GET方法获取的数据能够被缓存。
(2)以GET方法获取的数据会保存在浏览器的浏览记录中。
(3)以GET方法请求的URL能够保存为浏览器书签。
(4)以GET方法获取的数据有长度限制。
(5)GET方法主要用于获取数据。
(6)GET方法不应在处理敏感数据时使用。
1.2.4 POST方法
当客户端向服务器端发送请求时可以使用POST方法,比如当用户提交表单时,浏览器将使用POST方法提交表单内容。POST方法将请求参数放置在Request Body内,可以传输大量数据,也可以用来传送文件。举例如下。
POST方法不会像GET方法那样将参数显示在地址栏中,因此,如果用户输入的数据是敏感数据,那么还是使用POST方法为好。
POST方法的特点如下。
(1)以POST方法提交的数据不会被缓存。
(2)以POST方法提交的数据不会保留在浏览器历史记录中。
(3)以POST方法提交的数据不能被收藏至书签。
(4)POST方法对提交的数据长度没有要求。