HTTP (HyperText Transfer Protocol, 超文本传输协议)是互联网上应用最为普遍的一种网络协议,它是基于 TCP 的应用层协议,简单地说就是客户端和服务器进行通讯的一种规则,它的模式很是简单,就是客户端发起请求,服务器响应请求,以下图所示:javascript
HTTP 最先于 1991 年发布,是 0.9 版,不过目前该版本已再也不用。HTTP 目前在使用的版本主要有:css
HTTP 请求由三部分组成:html
如图所示:java
下面是一个 HTTP GET 请求的例子:python
GET / HTTP/1.1
Host: httpbin.org
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch, br Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4 Cookie: _ga=GA1.2.475070272.1480418329; _gat=1复制代码
上面的第一行就是一个请求行:nginx
GET / HTTP/1.1复制代码
其中,GET
是请求方法,表示从服务器获取资源;/
是一个请求地址;HTTP/1.1
代表 HTTP 的版本是 1.1。web
请求行后面的一系列键值对就是消息报头:shell
Host: httpbin.org
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch, br Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4 Cookie: _ga=GA1.2.475034215.1480418329; _gat=1复制代码
其中:数据库
max-age=秒
表示资源在本地缓存多少秒;HTTP 经过不一样的请求方法以多种方式来操做指定的资源,经常使用的请求方法以下表:json
方法 | 描述 |
---|---|
GET | 从服务器获取指定(请求地址)的资源的信息,它一般只用于读取数据,就像数据库查询同样,不会对资源进行修改。 |
POST | 向指定资源提交数据(好比提交表单,上传文件),请求服务器进行处理。数据被包含在请求正文中,这个请求可能会建立新的资源或更新现有的资源。 |
PUT | 经过指定资源的惟一标识(在服务器上的具体存放位置),请求服务器建立或更新资源。 |
DELETE | 请求服务器删除指定资源。 |
HEAD | 与 GET 方法相似,从服务器获取资源信息,和 GET 方法不一样的是,HEAD 不含有呈现数据,仅仅是 HTTP 头信息。HEAD 的好处在于,使用这个方法能够在没必要传输所有内容的状况下,就能够得到资源的元信息(或元数据)。 |
OPTIONS | 该方法可以使服务器传回资源所支持的全部 HTTP 请求方法。 |
注意到,POST 和 PUT 均可用于建立或更新资源,然而,它们之间仍是有比较大的区别:
好比,往某个站点添加一篇文章,若是使用 POST 来建立资源,可相似这样:
POST /articles HTTP/1.1
{
"author": "ethan",
"title": "hello world",
"content": "hello world"
}复制代码
在上面,POST 对应的 URI 是 /articles
,它是资源的接收者,而非资源的标识,若是资源被成功建立,服务器能够返回 201 Created
状态以及新建资源的位置,好比:
HTTP/1.1 201 Created
Location: /articles/abcdef123复制代码
咱们若是知道新建资源的标识符,能够使用 PUT 来建立资源,好比:
PUT /articles/abcdef234 HTTP/1.1
{
"author": "peter",
"title": "hello world",
"content": "hello world"
}复制代码
在上面,PUT 对应的 URI 是 /articles/abcdef234
,它指明了资源的存放位置,若是资源被成功建立,服务器能够返回 201 Created
状态以及新建资源的位置,好比:
HTTP/1.1 201 Created
Location: /articles/abcdef234复制代码
好比使用 PUT 更新地址为 /articles/abcdef234
的文章的标题,咱们须要发送全部值:
PUT /articles/abcdef234 HTTP/1.1
{
"author": "peter",
"title": "hello python",
"content": "hello world"
}复制代码
而使用 POST,能够更新某个域的值:
POST /articles/abcdef234 HTTP/1.1
{
"title": "hello python"
}复制代码
HTTP 方法的幂等性是指一次和屡次请求某一个资源应该具备一样的反作用,注意这里是反作用,而不是返回结果。
GET 方法用于获取资源,不会改变资源的状态,不论调用一次仍是屡次都没有反作用,所以它是幂等的;DELETE 方法用于删除资源,有反作用,但调用一次或屡次都是删除同个资源,产生的反作用是相同的,所以也是幂等的;POST 是不幂等的,由于两次相同的 POST 请求会在服务器建立两份资源,它们具备不一样的 URI;PUT 是幂等的,对同一 URI 进行屡次 PUT 的反作用和一次 PUT 是相同的。
HTTP 响应与 HTTP 请求类似,由三部分组成:
如图所示:
下面是一个 HTTP GET 请求的响应结果:
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 29 Nov 2016 13:08:38 GMT
Content-Type: application/json
Content-Length: 203
Connection: close
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
{
"args": {},
"headers": {
"Host": "httpbin.org",
"User-Agent": "Paw/2.3.1 (Macintosh; OS X/10.11.3) GCDHTTPRequest"
},
"origin": "13.75.42.240",
"url": "https://httpbin.org/get"
}复制代码
上面的第一行就是一个状态行:
HTTP/1.1 200 OK复制代码
其中,200
是状态码,表示客户端请求成功,OK
是相应的状态描述。
状态码是一个三位的数字,常见的状态码有如下几类:
状态行后面的一系列键值对就是消息报头,即响应头:
Server: nginx
Date: Tue, 29 Nov 2016 13:08:38 GMT
Content-Type: application/json
Content-Length: 203
Connection: close
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true复制代码
其中:
本文由 funhacks 发表于我的博客,采用 Creative Commons BY-NC-ND 4.0(自由转载-保持署名-非商用-禁止演绎)协议发布。
非商业转载请注明做者及出处。商业转载请联系做者本人。
本文标题为: HTTP 协议简介
本文连接为: funhacks.net/2017/03/01/…