http请求方式和状态管理
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请求方式和状态管理的更多相关文章
- HTTP请求方式及状态码
- 「Flink」Flink的状态管理与容错
在Flink中的每个函数和运算符都是有状态的.在处理过程中可以用状态来存储数据,这样可以利用状态来构建复杂操作.为了让状态容错,Flink需要设置checkpoint状态.Flink程序是通过chec ...
- React状态管理相关
关于React状态管理的一些想法 我最开始使用React的时候,那个时候版本还比较低(16版本以前),所以状态管理都是靠React自身API去进行管理,但当时最大的问题就是跨组件通信以及状态同步和状态 ...
- Tornado学习笔记(三) 请求方式/状态码
本章我们来学习 Tornado 支持的请求方式 请求方式 Tornado支持任何合法的HTTP请求(GET.POST.PUT.DELETE.HEAD.OPTIONS).你可以非常容易地定义上述任一种方 ...
- http状态码+http请求方式
一.http状态码 2开头 (请求成功)表示成功处理了请求的状态代码. 200 (成功) 服务器已成功处理了请求. 通常,这表示服务器提供了请求的网页. 201 (已创建) 请求成功并且服 ...
- http协议中常见的状态码以及请求方式,http协议的组成
请求状态码: 2xxx:表示请求成功,例如200. 3xxx:表示请求被重定向,表示完成请求,需要进一步操作,例如 302. 4xxx:表示请求错误,例如:404,资源没有找到. 5xxx:表示服务器 ...
- Java并发编程(01):线程的创建方式,状态周期管理
本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序 ...
- Redux状态管理方法与实例
状态管理是目前构建单页应用中不可或缺的一环,也是值得花时间学习的知识点.React官方推荐我们使用Redux来管理我们的React应用,同时也提供了Redux的文档来供我们学习,中文版地址为http: ...
- [译]面向初学者的Asp.Net状态管理技术
介绍 本文主要讲解Asp.Net应用程序中的状态管理技术(Asp.Net中有多种状态管理技术),并批判性地分析所有状态管理技术的优缺点. 背景 HTTP是无状态的协议.客户端发起一个请求,服务器响应完 ...
随机推荐
- Linux - CentOS6.5服务器搭建与初始化配置详解(上)
1.新建一个虚拟机 选择典型 单机下一步 p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm 0cm 0.0001pt; text-align: ...
- Java多线程——其他工具类CyclicBarrier、CountDownLatch和Exchange
CyclicBarrier 适用于:创建一组任务,它们并行地执行任务,然后在进行下一个步骤之前等待,直至所有任务完成.它使得所有的并行任务都将在栅栏处列队,因此可以一致地向前移动. 表示大家彼此等待, ...
- HTML5移动开发中的input输入框类型
HTML5规范引入了许多新的input输入框类型 在HTML5移动开发中,通过这些新的输入框类型来显示定制后的键盘布局,用户体验更好,更容易填写各种表单 本文中,实测手机为肾4S与米4 数字类型num ...
- JavaScript - 运算符 == 与 === 的区别
在 JavaScript 中,运算符 == 与 === 都是用来比较两个值是否相等.但是这两个操作符有个不同的地方:== 并不表示严格相等,而 === 表示进行严格比较,不仅比较值,而且会比较变量的类 ...
- MVC打包压缩JS&CSS文件调试时过滤了一些文件
BundleTable.这个确实是比较好用,打包并压缩了CSS,使之加载时减少流量. 但是在调试的时候会疑问为何有很多JS,CSS文件无法打包,其实是因为调试时VS自动过滤了如下文件: 后台跟踪了 ...
- IDEA SVN1.8 问题解决
转自 http://blog.jetbrains.com/idea/2013/12/subversion-1-8-and-intellij-idea-13/
- java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.String
http://blog.csdn.net/agileclipse/article/details/17161225 详情请点击链接查看
- python everything is object
python面向对象非常彻底,即使过程式的代码风格,python在运作的时候也是面向对象的.everything is object. 差异 在面向对象的理念上,python和非常工程化的面向对象语言 ...
- js对象的复制,传递,新增,删除和比较
当我们把一个某个对象拷贝或者传递给某个函数时,往往传递的是该对象的引用. 因此我们在引用上做的任何改动,都将会影响到它所引用的原对象. 复制,拷贝 var o = { add: 'Changdao ...
- discuz二次开发技巧
discuz二次开发技巧 二次开发大多时候知识设置和处理,如果能够获知模板文件获得的变量数组将大大提高我们的开发效率 获取页面已经定义的变量 <--{eval printf_r(get_defi ...