概述
HTTP(Hyper Text Transfer Protocol),超文本传输协议,是一种建立在TCP上的无状态连接,整个工作流程基本是由客户端(client)向服务端(server)发送一个http请求,向server端请求需要的资源,到server端收到客户端的请求后,根据请求做出相应的动作访问服务器资源,然后通过HTTP相应将结果返回给client端。
HTTP请求
http请求的格式都是固定的,一般都含有请求行、请求头、空行和请求实体四部分
请求行
包括请求方式Method、资源路径URL、协议版本Version
- Method
- GET: 访问服务器的资源
- POST: 向服务器发送要修改的数据
- HEAD: 获取服务器文档的首部
- PUT: 向服务器上传资源
- DELETE: 删除服务器的资源
- URL
服务器的资源目录
- Version
http的协议版本
请求头
紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息,包括一些访问的域名、用户代理、Cookie、连接方式等信息
- Accept: 指定客户端能够接收的内容格式类型
- Accept-Language: 指定客户端能够接受的语言类型
- Accept-Ecoding: 指定客户端能够接受的编码类型
- User-Agent: 用户代理,向服务器说明自己的操作系统、浏览器等信息
- Connection: 是否开启持久连接(keepalive)
- Host: 服务器域名
- …
空行
请求头部后面的空行是必须的
请求实体
http请求的数据
GET和POST区别
GET请求
GET /search/detail?ct=503316480&z=0&ipn=false&word=壁纸 HTTP/1.1
Host: image.baidu.com
Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Cookie: ****
Connection: Keep-Alive
空行
POST请求
POST /search/detail HTTP/1.1
Host: image.baidu.com
Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Cookie: ****
Connection: Keep-Alive
ct=503316480&z=0&ipn=false&word=壁纸
官方区别
- GET在浏览器回退时是无害的,而POST会再次提交请求。
- GET产生的URL地址可以被Bookmark,而POST不可以。
- GET请求会被浏览器主动cache,而POST不会,除非手动设置。
- GET请求只能进行url编码,而POST支持多种编码方式。
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
- GET请求在URL中传送的参数是有长度限制的,而POST没有,因为GET是通过url提交的。
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
- GET参数通过URL传递,POST放在Request body中。
深层次
-
GET和POST实质上都是基于TCP/IP的,本质上都是TCP连接,数据传输模式其实是一样的,给GET加上request body,给POST带上url参数,完全都可以用技术实现,上面那些不同其实都是基于HTTP的规则和浏览器/服务器的限制,导致GET和POST最终在应用上出现不同罢了
-
GET产生1个TCP数据包,POST产生2个TCP数据包,具体来说GET会将http header和data一并发送出去,服务器响应200,而POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据),因此时间消耗上就是POST更多
HTTP响应
和请求一样,HTTP响应的格式同样含有响应行、响应报头、空行和响应实体四部分
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://image.baidu.com
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html
Date: Sun, 21 Oct 2018 15:50:17 GMT
Search_result: OK
Server: Apache
Tracecode: ***
Tracecode: ***
Transfer-Encoding: chunked
Vary: Accept-Encoding
<html>
<head></head>
<body>
<!--body goes here-->
</body>
</html>
响应行
HTTP协议版本号Version, 状态码, 状态消息
- Version:HTTP/1.1
- 状态码 200
- 状态消息 ok
响应报头
类似于http请求一样的报头一样,都是一些附加信息
空行
响应实体
空行后面的html就是响应正文
HTTP工作流程
- 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
- 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
- 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
- 服务器对浏览器请求作出响应,并把对应的html文本发送给浏览器;
- 释放TCP连接;
- 浏览器显示html文本;