我们在网址上输入搜索内容按下回车后,会发生什么,结果大家当然熟悉,但是现在我们要来探讨一下中间的执行过程。
如我在百度搜索引擎上输入“HTTP请求报文”执行,浏览器会自动将我的输入信息打包成http请求报文发送给服务器,服务器解析后进行相应的反馈,将我的搜索结果打包成响应报文发过来,浏览器接收并解析,再将信息通过网页渲染加载出来。
而返回过来的网址为,https://www.baidu.com/s?ie=UTF-8&wd=HTTP%E8%AF%B7%E6%B1%82%E6%8A%A5%E6%96%87
此网址由于是通过GET请求的,信息会直接显示在路径的?后面,如ie=UTF-8,wd=HTTP····(后面看上去像是乱码的其实是中文转码)
我们现在就来看看HTTP请求报文最常用的两种方式:
GET:向服务器请求数据
POST:向服务器发送数据
注意get上的数据会直接明文显示在路径中,所以不安全,但其实post也只是稍微相对安全而已,信息很容易就被第三方获取了,实际上http都不安全,安全得使用https加密及数字证书等方式。
我们先随便看看请求头是怎么样的,我就直接在CSDN编辑页面中打开看看,得到以下截图:
authority:资源所在的主机名,此为mp.csdn.net
method:请求方法,此为GET
path:主机上资源所在的路径,此为······如图
scheme:协议名,https,那没事了,https咱们有机会在另一篇文章见,回归正题看看http吧
HTTP GET请求报文效果图如下:
---- 请求行 ----
GET / HTTP/1.1 # GET请求方式 请求资源路径 HTTP协议版本
---- 请求头 -----
Host: www.itcast.cn # 服务器的主机地址和端口号,默认是80
Connection: keep-alive # 和服务端保持长连接
Upgrade-Insecure-Requests: 1 # 让浏览器升级不安全请求,使用https请求
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 # 用户代理,也就是客户端的名称
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 # 可接受的数据类型
Accept-Encoding: gzip, deflate # 可接受的压缩格式
Accept-Language: zh-CN,zh;q=0.9 #可接受的语言
Cookie: pgv_pvi=1246921728; # 登录用户的身份标识
---- 空行 ----
GET请求原始报文说明:
GET / HTTP/1.1\r\n
Host: www.itcast.cn\r\n
Connection: keep-alive\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
Cookie: pgv_pvi=1246921728; \r\n
\r\n (请求头信息后面还有一个单独的’\r\n’不能省略,将留给POST的请求体隔开)
POST请求报文说明:
POST比起GET在最后一个空行后多了一个请求体
---- 请求行 ----
POST /xmweb?host=mail.itcast.cn&_t=1542884567319 HTTP/1.1 # POST请求方式 请求资源路径 HTTP协议版本
---- 请求头 ----
Host: mail.itcast.cn # 服务器的主机地址和端口号,默认是80
Connection: keep-alive # 和服务端保持长连接
Content-Type: application/x-www-form-urlencoded # 告诉服务端请求的数据类型
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 # 客户端的名称
---- 空行 ----
---- 请求体 ----
username=hello&pass=hello # 请求参数
POST请求原始报文说明:
POST /xmweb?host=mail.itcast.cn&_t=1542884567319 HTTP/1.1\r\n
Host: mail.itcast.cn\r\n
Connection: keep-alive\r\n
Content-Type: application/x-www-form-urlencoded\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36\r\n
\r\n(请求头信息后面还有一个单独的’\r\n’不能省略)
username=hello&pass=hello
这四段取自HTTP 请求报文_IT之一小佬的博客-CSDN博客_http请求报文
请求行:第一行,由请求方法,请求路径,协议版本组成
请求头:各个参数的说明,长短连接,cookie等信息
空行:与请求体隔开
请求体:放置关键信息如用户名等
GET由请求行,请求头,空行三部分组成
POST由请求行,请求头,空行,请求体四部分组成,POST可以没有请求体,但很少见
状态码
RFC标准把状态码分成了五类,用数字的第一位表示分类,五类分别为:
- 1××:提示信息,表示目前是协议处理的中间状态,还需要后续的操作;
- 2××:成功,报文已经收到并被正确处理;如200
- 3××:重定向,资源位置发生变动,需要客户端重新发送请求;
- 4××:客户端错误,请求报文有误,服务器无法处理;如最常见的404未找到
- 5××:服务器错误,服务器在处理请求时内部发生了错误。
HTTP的特点
- HTTP是灵活可扩展的,可以任意添加请求头自由的判断,所以遇到一些奇怪的请求头别意外。
- HTTP是可靠传输,基于TCP/IP协议,当然后面HTTP3.0是基于UDP的我们暂且不谈。
- HTTP是应用层协议,同FTP,SSH一样,顺带一提TCP,UDP是传输层。
- HTTP是请求-应答模式,客户端主动发起请求,服务器被动回复。
- HTTP本质是无状态的,每个请求都是相互独立的,毫无关联的。
HTTP的优点和缺点
- HTTP最大的优点是简单灵活易扩展,如上述第一个特点。
- HTTP是明文传输,容易分析但也容易被第三方获取,安全得靠HTTPS
- HTTP是不安全的,无法验证通信双方的身份,也不能判断报文信息是否被篡改,同上得看HTTPS。