http请求方式和状态管理

时间:2021-09-27 08:55:58

1、  HTTP协议

Internet的基本协议是TCP/IP协议(传输控制协议和网际协议),目前广泛使用的 FTP、HTTP(超文本传输协议)、Archie Gopher都是建立在TCP/IP上面的应用层协议,不同的协议对应不同的应用。而HTTP协议是Web应用所使用的主要协议。

HTTP协议是基于请求响应模式的。客户端向服务器发送一个请求,请求头包含请求的方法、 URI、协议版本、以及包含请求修饰符、客户端信息和内容的类似MIME的消息结果。服务器则以一个状态行作为响应,相应的内容包括消息协议的版本、成功 或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。

HTTP是无状态协议,依赖于瞬间或者近乎瞬间的请求处理。请求信息被立即发送,理想的情况是 没有延时的进行敕处理,不过,延时还是客观存在的。HTTP有一种内置的机制,在消息的传递时间上由一定的灵活性:超时机制。一个超时就是客户机等待请求 消息的返回信息的最长时间。

HTTP的请求和响应消息如果没有发送并传递成功的话,不保存任何已传递的信息。比如,单击“提交”按钮,如果表单没有发送出去,则浏览器将显示错误信息页,并且返回空白表单。虽然没有发送成功,但是HTTP不保存表单信息。

由于HTTP协议的上述特点,通常,客户端每次需要更新信息都必须重新向服务器发起请求,客户端收到服务器返回的信息后再更新屏幕内容。

基于HTTP协议的客户端/服务器请求响应机制的信息交换过程包括四个步骤:

  • 建立连接:客户端与服务器建立TCP连接;
  • 发送请求:打开一个连接后,客户端把请求消息送到服务器的相应端口上,完成请求动作提交;
  • 发送响应:服务器在处理完客户端请求之后,要向客户端发送响应消息;
  • 关闭连接:客户端和服务器双方都可以通过关闭套接字来结束TCP/IP对话。

HTTP的工作机制是请求消息和响应消息,最简单的情况,一个用户输入一个站点地址,发送一个请求。之后,浏览器返回所请求的页面,这个页面可能是简单的HTML页面,也可能是动态编译后的页面。如果这个页面有错误或者不存在,则Web服务器将发送错误信息页面。

Web服务器发送错误信息页是因为HTTP没有内置的处理机制,是无状态的,传输协议不记忆从 一条请求消息到另一条请求消息的任何信息。这个特点可以保证Web的一致性。但是,用户常常需要记忆一些设置内容或者浏览过程,这就需要在Web页面或者 URL中携带各种参数及其值。HTTP请求有多种样式,其中常用的有Post、Get、Head。

2、  Get请求

Get请求返回以URL形式表示的资源,当用户输入一个简单的URL 时,就是使用Get请求。Get请求可以发送Query String(就是在URL后用?附加一个参数列表),代表URL编码字符串的实际意义。

3、  Post请求

Post请求则将表单体置入Web服务器中,发送消息到公告板、新闻组、邮件列表或者其他机构 中,或者为数据处理机制提供诸如提交表单后的结果等数据。Post请求的功能由Web服务器决定,依赖于URL所指向的应用程序。长期以来,在填好的表单 提交之后,单击浏览器“后退”按钮,表单内容是空白的,这避免了用户由于疏忽两次提交表单的可能。不过很多浏览器还是会自动保存已经发送过的表单信息,单 击浏览器“后退”按钮也会看到刚刚提交的部分表单内容。

使用Get和Post提交表单的主要不同之处是Get显示追加了查询字符串的表单参数,Post连同请求消息体一起发送表单参数。

4、Head请求

除了服务器禁止在响应中发送消息体外,Head的发送方式和Get一致。Head请求的 HTTP头所包含的信息与Get请求的响应中的信息相同,可以使用Head请求获取没有发送消息体而由该请求暗指的消息的有关元信息。也可以使用请求消息 测试超文本连接的有效性、科访问性以及最新变动。

5、  状态管理

正如前面所提到的,HTTP协议是无状态的,不能保存每次提交的信息,即当服务器返回与请求相对应的应答之后,这次事务的所有信息就丢掉了。如果用户发来一个新的请求,服务器无法知道它是否与上次的请求有联系。

对于简单的静态HTML文件来说,这种特性很是适用,但是对于那些需要多次提交亲切才能完成的 Web操作比如购物车来说,就成问题了。服务器端Web应用程序必须允许用户通过多个步骤才能完整全部的物品采购。这种情况下,应用程序必须跟踪由同一个 浏览器发出的多个请求所提供的信息,即记住用户的交易状态。

通常,采取两种方法来解决这个问题。一是在每次应答中都返回完整的状态,让浏览器把它作为下一次请求的一部份再发送回来。二是把状态保存在服务器的某个地方,只发送回一个标识符,浏览器在下次提交中再把这个标识符发送回来;这样就可以定位存储在服务器上的状态信息了。

在这两种方法中,信息可以通过下列三种方法之一发送给浏览器:作为Cookie、作为隐藏域嵌入HTML表单中、附加在主体的URL中(通常作为指向其他应用程序页面的链接,即URL重写)。

Cookie是服务器在应答信息中传送给浏览器的名称/值对。浏览器保存这些Cookie,保 存的期限由Cookie的有效期属性决定。当浏览器向服务器发送一个请求时,它检查Cookie设置,并将它从同一个服务器收到的所有Cookie都注入 请求信息中。使用Cookie是处理状态问题的一个简单的方法,但不是所有的浏览器都支持,用户也可能禁用Cookie。

如果使用HTML表单中隐藏域来向浏览器发送状态信息的话,当表单提交时,浏览器将以常规HTTP参数的方式将这些信息返回服务器。当状态信息被注入URL时,它将作为请求URL的一部分被传送到服务器。

在浏览器和服务器之间反复的来回传送所有状态信息不是一种高效的方法,所以大部分的服务器还是 选择在服务器上保存信息,而只在浏览器和服务器之间传送一个标识符。这个就是所谓的会话(Session)跟踪。来自浏览器的所有包含同一个标识符(这里 是会话ID)的请求同属于一个会话,服务器则对与会话有关的所有信息保持跟踪。会话的有效期直到它被显式的中止,或者当用户在一段时间内没有动作,有服务 器自动设置为过期。目前没有办法通知服务器用户已经关闭浏览器,因为在浏览器和服务器之间并不存在持久的连接,并且当浏览器关闭时也不向服务器发送消息。 同时,关闭浏览器通常意味着会话ID丢失;Cookie将过期,或者注入了信息的URL将不能再使用。所以,当用户再次打开浏览器的时候,服务器无法将新 的请求与以前的会话联系起来,而只能创建一个新的会话。然而,所有与前一个会话有关的数据依然存在服务器上,直到会话过期被清除为止。