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将不能再使用。所以,当用户再次打开浏览器的时候,服务器无法将新 的请求与以前的会话联系起来,而只能创建一个新的会话。然而,所有与前一个会话有关的数据依然存在服务器上,直到会话过期被清除为止。

http请求方式和状态管理的更多相关文章

  1. HTTP请求方式及状态码

  2. 「Flink」Flink的状态管理与容错

    在Flink中的每个函数和运算符都是有状态的.在处理过程中可以用状态来存储数据,这样可以利用状态来构建复杂操作.为了让状态容错,Flink需要设置checkpoint状态.Flink程序是通过chec ...

  3. React状态管理相关

    关于React状态管理的一些想法 我最开始使用React的时候,那个时候版本还比较低(16版本以前),所以状态管理都是靠React自身API去进行管理,但当时最大的问题就是跨组件通信以及状态同步和状态 ...

  4. Tornado学习笔记(三) 请求方式/状态码

    本章我们来学习 Tornado 支持的请求方式 请求方式 Tornado支持任何合法的HTTP请求(GET.POST.PUT.DELETE.HEAD.OPTIONS).你可以非常容易地定义上述任一种方 ...

  5. http状态码+http请求方式

    一.http状态码 2开头 (请求成功)表示成功处理了请求的状态代码. 200   (成功)  服务器已成功处理了请求. 通常,这表示服务器提供了请求的网页. 201   (已创建)  请求成功并且服 ...

  6. http协议中常见的状态码以及请求方式,http协议的组成

    请求状态码: 2xxx:表示请求成功,例如200. 3xxx:表示请求被重定向,表示完成请求,需要进一步操作,例如 302. 4xxx:表示请求错误,例如:404,资源没有找到. 5xxx:表示服务器 ...

  7. Java并发编程(01):线程的创建方式,状态周期管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序 ...

  8. Redux状态管理方法与实例

    状态管理是目前构建单页应用中不可或缺的一环,也是值得花时间学习的知识点.React官方推荐我们使用Redux来管理我们的React应用,同时也提供了Redux的文档来供我们学习,中文版地址为http: ...

  9. [译]面向初学者的Asp.Net状态管理技术

    介绍 本文主要讲解Asp.Net应用程序中的状态管理技术(Asp.Net中有多种状态管理技术),并批判性地分析所有状态管理技术的优缺点. 背景 HTTP是无状态的协议.客户端发起一个请求,服务器响应完 ...

随机推荐

  1. MyBatis Tutorial – CRUD Operations and Mapping Relationships – Part 1---- reference

    http://www.javacodegeeks.com/2012/11/mybatis-tutorial-crud-operations-and-mapping-relationships-part ...

  2. c#中jeson字符串和OBJECT对象的相互转换

    对于本问题   我用三步来分别说明实现过程 1.定义一个类---- 实现转换的具体方法 using System; using System.Collections.Generic; using Sy ...

  3. URAL 1988 - Planet Ocean Landing【几何&三分答案】

    [题意] 在一个星球(是一个球体)表面有一个飞机(坐标(x1,y1,z1),原点是星球中心),在空中有一个空间站(坐标(x2,y2,z2)),所有值均小于100,现在要使飞机与空间站相遇,飞机的速度是 ...

  4. gamit10.6问题汇总

    1.在处理精密星历时,提示:old version of file not supported (name svnav.dat) 解决办法:在gamit10.5中不会出现这个问题,10.6中的官方文档 ...

  5. iOS 获取通讯录里边的电话号码AddressBook

    1  首先导入库 <AddressBook/AddressBook.h> 2 然后在导入#import <AddressBook/AddressBook.h>文件 3 声明   ...

  6. 利用CMake自己创建OpenCV静态链接库

    1.准备工作: 1)完成Visual Studio2012安装: 2)下载并解压CMake3.5.0: 3)下载并解压OpenCV2.4.12: 4)下载并解压TBB44_20160128oss. 2 ...

  7. C++序列化库的实现

    C++中经常需要用到序列化与反序列化功能,由于C++标准中没有提供此功能,于是就出现了各式各样的序列化库,如boost中的,如谷歌的开源项目,但是很多库都依赖其他库过于严重,导致库变得很庞大.今天来分 ...

  8. 浅谈 trie树 及其实现

    定义:又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构, 如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. 核心思想:是空间换时间.利用字符串的公共前缀来降低查询时间的开 ...

  9. c++primerplus(第六版)编程题——第5章(循环和关系表达式)

    声明:作者为了调试方便,每一章的程序写在一个工程文件中,每一道编程练习题新建一个独立文件,在主函数中调用,我建议同我一样的初学者可以采用这种方式,调试起来会比较方便. (具体方式参见第3章模板) 1. ...

  10. SGU 143.Long Live the Queen(女王万岁)

    时间限制:0.25s 空间限制:4M 题意: 有n(n<=16000)个小镇,每两个小镇有且仅有一条路径相连.每个小镇有一个收益x(-1000<=x<=1000). 现在要求,选择一 ...