HTTP协议简介
- HyperText Transfer Protocol,超文本传输协议;
- 基于 TCP 的应用层协议;
- 客户端发起请求,服务器响应请求。
- 版本
- HTTP/ 0.9 ,最早于 1991 年发布,目前已不再用;
- HTTP/1.0, 1996 年发布,引入了多种功能,至今仍在使用当中。
- HTTP/1.1,1997 年 发布,持久连接被默认采用,目前最流行的版本。
- HTTP/2 ,2015 年 发布,引入了服务器推送等多种功能,目前最新的版本。
HTTP 请求
HTTP 请求由三部分组成:
请求行:包含请求方法、请求地址和 HTTP 协议版本
消息报头:包含一系列的键值对
请求正文(可选):注意和消息报头之间有一个空行
举例: HTTP GET 请求
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
上面的第一行:请求行
GET 是请求方法,表示从服务器获取资源;/ 是一个请求地址;HTTP/1.1 表明版本是 1.1。
请求行后面的一系列键值对就是消息报头。
其中:
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 | 从服务器获取指定(请求地址)的资源的信息,它通常只用于读取数据,就像数据库查询一样,不会对资源进行修改。 |
POST | 向指定资源提交数据(比如提交表单,上传文件),请求服务器进行处理。数据被包含在请求正文中,这个请求可能会创建新的资源或更新现有的资源。 |
PUT | 通过指定资源的唯一标识(在服务器上的具体存放位置),请求服务器创建或更新资源。 |
DELETE | 请求服务器删除指定资源。 |
HEAD | 与 GET 方法类似,从服务器获取资源信息,和 GET 方法不同的是,HEAD 不含有呈现数据,仅仅是 HTTP 头信息。HEAD 的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获得资源的元信息(或元数据)。 |
OPTIONS | 该方法可使服务器传回资源所支持的所有 HTTP 请求方法。 |
HTTP 响应
HTTP 响应与 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"
}
上面的第一行就是一个状态行:
其中,200 是状态码,表示客户端请求成功,OK 是相应的状态描述。
状态码是一个三位的数字,常见的状态码有以下几类:
1XX 消息 -- 请求已被服务接收,继续处理
2XX 成功 -- 请求已成功被服务器接收、理解、并接受
200 OK
201 Created 已创建
202 Accepted 接收
203 Non-Authoritative Information 非认证信息
204 No Content 无内容
3XX 重定向 -- 需要后续操作才能完成这一请求
301 Moved Permanently 请求永久重定向
302 Moved Temporarily 请求临时重定向
304 Not Modified 文件未修改,可以直接使用缓存的文件
305 Use Proxy 使用代理
4XX 请求错误 -- 请求含有词法错误或者无法被执行
400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解
401 Unauthorized 请求未经授权。这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因
404 Not Found 请求的资源不存在,例如,输入了错误的URL
5XX 服务器错误 -- 服务器在处理某个正确请求时发生错误
500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求
503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常
504 Gateway Time-out 网关超时
状态行后面的一系列键值对就是消息报头,即响应头:
其中:
Server 包含了服务器用来处理请求的软件信息,跟请求报头域 User-Agent 相对应;
Content-Type 用于指定发送给接收者(比如浏览器)的响应正文的媒体类型,比如 text/html, text/css, image/png, image/jpeg, video/mp4, application/pdf, application/json 等;
Content-Length 指明本次回应的数据长度;
GET 和 POST
表单提交的两种方式(method)get和post。
说明:
- get方式提交表单,参数会出现在URL中,而post不会
- 浏览器对URL长度有限制,get提交数据时URL长度不能太长(2kB),而post提交理论上没有限制,携带的数据量比get多
- get提交是以明文方式直接出现在URL中,不适合机密数据传递(如密码),post则更安全。
- get请求有利于保存URL,可以再次访问及传播,post则不具有。
参考资料
网友评论