HTTP请求
HTTP请求由三部分组成:html
- 请求行:包含请求方法、地址和HTTP的协议版本
- 消息报头:包含一系列的键值对
- 请求正文(可选):和消息报头之间有一个空行
信息报头中的主要信息有数据库
- Host 是请求报头域,用于指定被请求资源的 Internet 主机和端口号,它一般从 HTTP URL 中提取出来;
- Connection 表示链接状态,keep-alive 表示该链接是持久连(persistent connection),即 TCP 链接默认不关闭,能够被多个请求复用,若是客户端和服务器发现对方有一段时间没有活动,就能够主动关闭链接;
- Cache-Control 用于指定缓存指令,它的值有 no-cache, no-store, max-age 等,max-age=秒表示资源在本地缓存多少秒;
- User-Agent 用于标识请求者的一些信息,好比浏览器类型和版本,操做系统等; Accept
用于指定客户端但愿接受哪些类型的信息,好比 text/html, image/gif 等;
- Accept-Encoding 用于指定可接受的内容编码;
- Accept-Language 用于指定可接受的天然语言;
- Cookie 用于维护状态,可作用户认证,服务器检验等,它是浏览器储存在用户电脑上的文本片断;
HTTP的请求方式
HTTP请求方式一般有几种方式浏览器
- GET(SELECT):
从服务器取出资源(一项或多项),从服务器获取指定(请求地址)的资源信息,它一般只用于读取数据,就像数据库查询同样,不会对资源进行修改
- POST(CREATE):在服务器新建一个资源。向指定资源提交数据(好比提交表单,上传文件),请求服务器进行处理。数据被包含在请求正文中,这个请求可能会建立新的资源,或者更新现有的资源
- PUT(UPDATE): 在服务器更新资源(客户端提供改变后的完整资源)。经过指定资源的惟一标识(在服务器上的具体存放位置),请求服务器建立或更新资源。
- PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
- DELETE(DELETE):从服务器删除资源。
- HEAD:获取资源的元数据
- OPTIONS:获取信息,关于资源的哪些属性是客户端能够改变的。
GET和POST的区别:
- get的数据在url上,post在request body上
- get只能进行url编码,post有多种编码方式
- get是tcp/ip一次,post是两次
- 对get的参数有字符限制,而post没有(浏览器对URL的长度有限制,因此GET请求不能代替POST请求发送大量数据)
- get请求会被浏览器缓存,可是post不会,除非手动设置
- 当浏览器回退时,get是没有影响的,可是post会再次提交请求
- 对参数的数据类型,get只能是ASCII字符,可是post没有限制
- 对于第三点中的:get只产生一个TCP数据包,post是两个数据包。get请求中会把header和data一并发送,可是post会先发送header,浏览器响应100 continue以后,再发送data。
- GET请求是幂等的
举个例子:
GET只须要汽车跑一趟就能把货送到,而POST要跑两趟。第一趟先去和服务器打个招呼“hi,我等下要送一批货,大家打开门迎接我”,而后再回头把货送过去。缓存
由于POST须要两步,时间上消耗的要多一点,看起来GET比POST更有效,可是不能随便改变两种请求方式
1.get和post都有本身的语义,不能随便混用
2.网络环境好的时候,发一次包的时间和发两次宝的时间基本能够忽略。可是在网络环境差的状况下,两次包的TCP在验证数据包完整性上,有很是大的优势
3.并非全部浏览器都会在POST中发送两次包,Firefox就只发送一次。安全
HTTP特色
- 客户端/服务端模式
- 简单快速:客户端向服务器请求服务时,经过传送请求方式、请求地址和数据体(可选)便可
- 灵活:容许传输任意类型的数据对象,经过Content-Type标识
- 无状态:对事物处理没有记忆能力
小结
- GET 可提交的数据量受到 URL 长度的限制,HTTP 协议规范没有对 URL 长度进行限制,这个限制是特定的浏览器及服务器对它的限制。
- 理论上讲,POST 是没有大小限制的,HTTP 协议规范也没有进行大小限制,出于安全考虑,服务器软件在实现时会作必定限制
参考连接:网络
99%的人都理解错了HTTP中GET与POST的区别并发