Http目前有1.0和1.1两个版本
http 1.0是非持续性连接
http 1.1是持续性连接
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。
GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。
什么是Http?
Http是基于TCP/IP数据通信协议的一个通信规则。
不管是Get、Post、Put还是Delete都是基于TCP/IP来做的,都是TCP/IP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。
但是,它们之间的区别,到底有哪些呢?
我们先看看它们之间是怎么进行工作的。
![](https://i-blog.csdnimg.cn/blog_migrate/29b272136fce2b4625f5a0a9e58759c6.png)
下面对上图进行简单的分析:
请求行
由请求方法字段、URL 字段、协议版本字段三部分构成,它们之间由空格隔开。常用的请求方法有:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
请求头
请求头由 key/value 对组成,每行为一对,key 和 value 之间通过冒号(:)分割。请求头的作用主要用于通知服务端有关于客户端的请求信息。
典型的请求头有:
User-Agent:生成请求的浏览器类型
Accept:客户端可识别的响应内容类型列表;星号* 用于按范围将类型分组。*/*表示可接受全部型,type/*表示可接受 type 类型的所有子类型。
Accept-Language: 客户端可接受的自然语言
Accept-Encoding: 客户端可接受的编码压缩格式
Accept-Charset: 可接受的字符集
Host: 请求的主机名,允许多个域名绑定同一 IP 地址
connection:连接方式(close 或 keeplive)
Cookie: 存储在客户端的扩展字段空行
最后一个请求头之后就是空行,用于告诉服务端以下内容不再是请求头的内容了。
请求内容
请求内容主要用于 POST 请求,与 POST 请求方法配套的请求头一般有 Content-Type(标识请求内容的类型)和 Content-Length(标识请求内容的长度)
响应报文
HTTP 响应报文由状态行、响应头、空行和响应内容 4 个部分构成。
如下图所示:
下面对响应报文格式进行简要的分析说明:
状态行
由 HTTP 协议版本、状态码、状态码描述三部分构成,它们之间由空格隔开。
状态码由 3 位数字组成,第一位标识响应的类型,常用的 5 大类状态码如下:
1xx:表示服务器已接收了客户端的请求,客户端可以继续发送请求
2xx:表示服务器已成功接收到请求并进行处理
3xx:表示服务器要求客户端重定向
4xx:表示客户端的请求有==非法内容==
5xx:标识服务器未能正常处理客户端的请求而出现意外错误
常见状态码说明:
200 OK: 表示客户端请求成功
400 Bad Request: 表示客户端请求有语法错误,不能被服务器端解析
401 Unauthonzed: 表示请求未经授权,该状态码必须与WWW-Authenticate 报文头一起使用
404 Not Found:请求的资源不存在,例如输入了错误的 url
500 Internal Server Error: 表示服务器发生了不可预期的错误,导致无法完成客户端的请求
503 Service Unavailable:表示服务器当前不能处理客户端的请求,在一段时间后服务器可能恢复正常响应头
一般情况下,响应头会包含以下,甚至更多的信息。
Location:服务器返回给客户端,用于重定向到新的位置
Server: 包含服务器用来处理请求的软件信息及版本信息
Vary:标识不可缓存的请求头列表
Connection: 连接方式。
对于==请求端==来讲:close 是告诉服务端,断开连接,不用等待后续的求请了。keeplive 则是告诉服务端,在完成本次请求的响应后,保持连接,等待本次连接后的后续请求。
对于==响应端==来讲:close 表示连接已经关闭。keeplive 则表示连接保持中,可以继续处理后续请求。Keep-Alive 表示如果请求端保持连接,则该请求头部信息表明期望服务端保持连接多长时间
(秒),例如 300 秒,应该这样写 Keep-Alive: 300空行
最后一个响应头之后就是空行,用于告诉请求端以下内容不再是响应头的内容了。
响应内容
服务端返回给请求端的文本信息。
1.根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的
。
这里的安全,是相对数据操作而言,因为它不会对数据进行修改。
幂等:抽象代数概念,多次请求,返回结果相同。
2.
根据HTTP规范,POST表示可能修改变服务器上的资源的请求
。
Get | Post |
传输数据量相对小,1KB(1024字节)一下 | 传输数据量相对大本身是没有明确的限制,主要看接收服务器的控制 |
请求参数放URL,也有放Body里面的,但如果服务器不接收,等同于没传 | 请求参数放实体里面 |
等同于一个查询请求,对数据本身不会做修改 | 可以对数据做修改操作 |
一个TCP数据包 | 两个TCP数据包(先发送一个TCP数据包,消息头header,然后服务器响应100 continue,再发送data,服务器响应返回状态码 200 ) |
| |
早期的Web MVC框架设计者们并没有有意识地将URL当作抽象的资源来看待和设计,所以导致一个比较严重的问题是传统的Web MVC框架基本上都只支持GET和POST两种HTTP方法,而不支持PUT和DELETE方法。
* 简单解释一下MVC:MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。
参考资料:
http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html
http://www.techweb.com.cn/network/system/2016-10-11/2407736.shtml