HTTP的常见方法
- GET方法:获取资源
客户端请求指定的资源信息,服务器返回指定资源。 - POST方法:传输实体主体
一般用于表单的提交数据,将客户端的数据提交到服务器。 - PUT方法:传输文件
在请求报文主体中包含文件的内容,然后保存到请求URL指定的位置。 - HEAD方法:获得报文首部
请求HTTP 首部,响应报文中用于确认URL的有效性及资源更新的日期时间等。 - DELETE方法:删除文件
请求服务器删除指定的资源。 - OPTIONS方法:询问支持的方法
用来查询请求URL指定的资源支持的方法。 - TRACE方法:追踪路径
回显服务器收到的请求,主要用于测试或诊断。 - CONNECT方法:要求用隧道协议连接代理
GET和POST的区别
- 功能上
get 是从服务器上获取数据,post 是向服务器传送数据。 - 数据存储上
get 是把参数数据队列加到提交表单的 ACTION 属性所指的 URL 中,值和表单内各个字段一一对应,在URL中可以看到。post 是将表单中的数据放在的数据体中,按照变量和值相对应的方式,传递到 action 所指向URL。用户看不到这个过程。 - 安全上
get 的安全性较低,post 安全性较高, 通过 get 提交数据,用户名和密码将明文出现在 URL 上。Post的所有操作对用户来说都是不可见的。 - 传送的数据量
get 传送的数据量较小,长度受到 URL 长度的限制,post 传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。也跟各个浏览器、操作系统以及服务器的限制有关。 - 缓存
get 通过一次请求的时候会在浏览器上进行一次缓存,post 不会。 - get会产生一个TCP数据包,POST会产生两个TCP数据包。
get会发送http header和data给服务端,服务端返回一个200,请求成功。
post会先发送http header给服务端,告诉服务端等一下会有数据过来,服务端返回100,告诉客户端已经准备接收数据,post在发送一个data给服务端,服务端返回200,请求成功。但是上面所说的post会比get多一个tcp包其实不太严谨。多发的那个expect 100 continue header报文,是由客户端对http的post和get的请求策略决定的,目的是为了避免浪费资源,如带宽,数据传输消耗的时间等等。所以客户端会在发送header的时候添加expect 100去探探路,如果失败了就不用继续发送data,从而减少了资源的浪费。所以是否在发送一个包取决了客户端的实现策略,和get/post并没什么关系。有的客户端比如fireFox就只发送一个包。
HTTP 的状态码
- 1消息
100 Continue:客户端应当继续发送请求。这个临时响应式用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分。 - 2成功
这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。
200:请求成功,请求所希望的响应头或数据体将随此响应返回。 - 3重定向
301:永久重定向,表示所请求的文档在别的地方,文档新的 URL 会在定位响应头信息中给出,浏览器自动连接到新的 URL。
302:临时重定向,服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
304:未修改,自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。 - 4请求错误
400 :错误请求,服务器不理解请求的语法。
401:未授权,访问被拒绝。
403:禁止访问,服务器拒绝请求。
404:未找到,服务器找不到请求的网页。
408:请求超时,服务器等候请求时发生超时。
410:已删除,如果请求的资源已永久被删除,服务器就会返回此响应。 - 5服务器错误
500:服务器遇到错误,无法完成请求。
502:错误网关,服务器作为网关或代理,从上游服务器收到无效响应。
503:服务不可用,服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
505:HTTP 版本不支持,服务器不支持请求中所用的 HTTP 协议版本
HTTP版本
http 1.0:
每个TCP连接只能发送一个请求,发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。
头信息是 ASCII 码,后面数据可为任何格式。
服务器回应时会告诉客户端,数据是什么格式,即Content-Type字段的作用。这些数据类型总称为MIME即多用途互联网邮件扩展,每个值包括一级类型和二级类型,预定义的类型,也可自定义类型, 常见Content-Type值:text/xml image/jpeg audio/mp3
http 1.1:
新增方法:PUT、PATCH、OPTIONS、DELETE
引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。对于同一个域名,大多数浏览器允许同时建立6个持久连接。
引入了管道机制,即在同一个TCP连接里,客户端可以同时发送多个请求,进一步改进了HTTP协议的效率。
同一个TCP连接里,所有的数据通信是按次序进行的。服务器只能顺序处理回应,前面的回应慢,会有许多请求排队,造成"队头堵塞"(Head-of-line blocking)
为避免上述问题
两种方法:一是减少请求数,二是同时多开持久连接
http1.1没有解决的问题
1.传输数据是明文
2.header头部数据太长
3.每次传输还是要重新连接
4.server不能主动push
Http2.0
HTTP2.0是SPDY(谷歌公司研发的https的一种协议)的升级版
1.头信息和数据体都是二进制,称为头信息帧和数据帧
2.复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,避免了“队头堵塞“,此双向的实时通信称为多工。
3.引入头信息压缩机制,头信息使用gzip或compress压缩后再发送;客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,不发送同样字段,只发送索引号,提高速度
4.HTTP/2 允许服务器未经请求,主动向客户端发送资源,即服务器推送(server push)
http1.0和http1.1的区别
-
长连接
HTTP 1.1支持长连接和请求的流水线处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,弥补了HTTP1.0每次请求都要创建连接的缺点 -
缓存处理
在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略 -
带宽优化和网络连接的使用
HTTP1.0中,存在一些浪费带宽的现象,例如:客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),方便了开发者自由的选择以便于充分利用带宽和连接 -
错误通知的管理
在HTTP1.1中新增24个状态响应码,如
409(Conflict)表示请求的资源与资源当前状态冲突;.
410(Gone)表示服务器上的某个资源被永久性的删除 -
Host头处理
在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request) -
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。