前置知识
1.什么是http协议?
答:http协议是处于应用层的一个协议,用来约定数据在网络传输中的格式等
2.使用场景?
答:网页和服务器的交互、手机app和服务器的交互
3.如何学习http协议格式?
答:学习一个协议,就要认识它的报文结构;我们可以通过“抓包”工具,就可以捕获到http协议的请求报文和响应报文的内容
4.一条http请求和响应是什么样的?
答:
目录
一、http请求报文
这里我们介绍两个部分,第一部分是http请求报文的格式,第二部分是格式中的每个内容。
1.请求报文格式
这里的内容比较简单,就介绍报文有哪些部分组成,具体每个部分的内容后面介绍
http请求报文=首行 + 请求头 + 空行 + 正文body
先通过抓包工具观察一个抓到的http请求
正文body不是所有的请求都会有
1.1.首行
在首行中,也就是第一行,又包含了三个部分:请求的方法、请求的URL、请版本号,这三部分之间使用空格分隔
(1)请求的方法
例如:POST或者GET
方法表名该http请求是要做什么?要从服务器中获取什么数据
(2)请求的URL
url就是要请求的网址
(3)版本号
版本号也就是使用的http协议版本
1.2.请求头(header)
(1)对于请求头,从第二行开始,到空行位置。请求头由一个个键值对构成
(2)键值对也就是一个键对应一个值,中间使用冒号分隔,每对键值对在不同行
1.3.空行
(1)空行就是空着的一行,类似换行,如果没有正文body,空行肉眼是看不出来的。
(2)空行也是一定会存在的
1.4.正文body
(1)对于正文来说,是否有都是可选择的
(2)正文里面的内容可以是任意的语言、格式、数据、字体、图片等,也可以出现空行
2.请求报文内容
这一部分,就要介绍一个请求报文中,每个部分的内容代表什么或者是什么了
2.1.URL格式内容
这里介绍的url就是指http请求的首行中的url,其实也就是一个网址,通过请求这个网址,就可以打开特定的网址。
url格式=协议名称 + 身份认证信息 + ip地址/域名 + 端口号 + 路径 + 查询字符串 + 片段标识符
以上一共七个信息,但不是每个信息都会存在,也有一些是被废弃的。
(1)协议名称
比如:https://,描述了url接下来要做什么
(2)身份认证信息
这一栏是很古老的写法,现在一般都不会有这个信息了,了解就好。
(3)ip地址/域名(必要)
也称为服务器地址,表示要访问哪一个服务器。
(4)端口号
端口号可以省略不写,浏览器会自动设置一个默认的端口
对于不同的协议,分配的端口号也有差异
(5)路径(必要)
路径,就描述了要访问服务器的哪个资源。
例如一个文件的绝对路径一样,可以确定唯一的一个资源
(6)查询字符串(query string)(必要)
查询字符串,就是请求中的参数,描述了客户端需要向服务器发送的数据/内容
query string中的内容也是一些键值对,键值对的内容都是由程序员自己定义。
又比如,我们去搜索鲜花:我们请求的关键字就会存在于query string中
(7)片段标识符
这一部分内容不是很重要,一般出现在有目录的网页中,每点击一次目录,这里的值都会发生变化。
(8)小结
对于url,我们重点掌握:协议名称 + ip地址 + 带层次的文件目录 + 查询字符串
2.2.URL encode
这里的内容也是针对请求首行中的url的query stirng,也就是针对query string中键值对中的value值,需要对value值进行转义。
(1)encode定义
就是要针对url中的特殊字符按照encode规则进行转义
(2)为什么要转义
在url中,或有很多的特殊字符,比如::、/、?、&等,如果这些字符串不做处理出现在query string中的value里,就会是url的解析出现问题,所以要进行转义。
并且,汉字也会进行转义
(3)转义的基本规则
如果在url中看到了很多%,就说明是经过转义的。
一般按照utf-8进行转义,转义后,每个字节前面就会加上一个%,
2.3.请求的方法
这里要介绍的部分位于请求首行中的第一部分:方法,前面已经见过了POST方法和GET方法,接下来,介绍更多的方法。
(1)方法总览
方法 | 说明 | 支持的http协议版本GET |
---|---|---|
GET | 获取资源 | 1.1、1.1 |
POST | 传输实体主体 | 1.0、1.1 |
PUT | 传输文件 | 1.0、1.1 |
HEAD | 获取报文首部 | 1.0、1.1 |
DELETE | 删除文件 | 1.0、1.1 |
OPTIONS | 询问支持的方法 | 1.1 |
TRACE | 追踪路径 | 1.1 |
CONNECT | 要求用隧道协议连接代理 | 1.1 |
LINK | 建立和资源之间的联系 | 1.0 |
UNLINK | 断开连接关系 | 1.0 |
方法的作用,就描述了该请求要干什么,是一个动作,并不是直接包含请求的内容。
比如,GET,就表明该请求需要获取资源,但是该请求就一定得获取资源吗?都不一定的。
(2)重点方法
上述看似有很多方法,其实就只需要掌握几个即可。
GET、POST这两个是涵盖了99.99%的请求,其中GET又占了90%。
PUT方法和POST方法类似,是用来给服务器提交数据的;
DELETE方法和GET类似,但是没有正文body,纯使用query string。
(3)POST的场景
几乎很多请求的方法都是GET,POST的请求都非常少了,不过有两个场景还是使用POST
1)登陆场景
2)上传文件
(4)如何构造http请求
GET请求:
1)浏览器地址栏直接输入url或者点击收藏夹中的网址
2)网页html中的一些特殊的标签
3)表单
4)通过Js构造
POST请求:
1)表单
2)js
(5)GET和POST的区别(重点面试题)
GET和POST从本质上来说,没有什么区别;GET的场景,使用POST也OK,PSOT的场景,使用GET也没问题
但是从使用习惯上有区别
1)从语义上来说,GET表示“获取数据”,POST表示“提交数据”
2)在传递数据的时候,GET通常使用query string,POST通常使用body
3)服务器对于请求的设计,GET请求经常设计成“幂等”,而POST不要求“幂等”
4)GET请求的结果,可以被缓存,也可以被浏览器搜藏夹搜藏,但POST一般不行
(6)一些错误理解POST和GET区别的说法
1)POST比GET安全
安全与否,不看密码啥的是否显示在屏幕上,而是看是否加密
2)GET传输的数据量比较有限、比较短;POST传输的数据量比较长,没有限制。
其实,GET中的url长度是没有限制的
3)GET只能传输文本数据,POST可以传输文本,也能传输二进制
其实都可以
2.4.请求报头header
请求报头中,都是由键值对构造,每个键值对表示的意义都不一样,下面介绍几个典型代表的键值对
(1)Host
含义:请求对应主机的ip和端口
这里的值一般和url中的ip是一样的
比如:
也有不一样的情况:
比如通过代码构造http请求,url中写的是ip,而host中写的是域名
(2)Content-Length和Content-Type
Content-Length:表示body中的数据长度,如果不存在body,就不会存在这个键值对
作用:可以解决粘包问题,知道一个http请求是多长
Content-Type:表示body中的数据格式
作用:知道了类型,就可以去解析。
(3)User-Agent(UA)
含义:包含了浏览器版本和操作系统版本,就描述了用户使用什么样的设备打开该网页
早期作用:用来兼容不同版本的浏览器。例如:可以根据UA来给用户返回兼容的浏览器版本。因为有的可能是只有文字、有的会有图片、甚至还能交互等。
现在的作用:用来区分电脑端和手机端。因为端不同,能接受的网页大小也不同。
(4)Referer
含义:里面的值可以反应当前的页面是从哪一个页面跳转过来的。如果没有跳转,这该值不存在。
应用场景:可投放在广告上,该页面是从哪一个浏览器跳转过来的,都可以清晰的记录下来。
(5)Cookie(最重要)
为什么存在cookie?
一个网页不能直接访问客户端的硬盘,因此不能将一些必要的信息存储在客户端这边,所以浏览器就提供了一种机制:cookie。允许将一些信息存储在cookie中,进而将cookie保存在客户端硬盘上
浏览器会针对不同的域名,也就是每一个网站,都有一份Cookie文件,不同网站之间的Cookie互相不影响。而且Cookie里面存储的是键值对,每个键值对的是什么意思,是程序员自己定义的。
Cookie是啥?
Cookie是浏览器本地存储数据的一种机制
Cookie从哪里来?
当浏览器第一次访问一个网站时,此时对应的cookie是空的;当服务器返回http响应时,就会将响应的cookie带回,并且保存在浏览器上。因此,cookie是网站服务器带回的,存在http响应的header中,在Set-Cookie上
Cookie怎么存的?
按照不同的域名,分别存储在硬盘上。不同域名之间的Cookie互不干扰。对于里面的键值对和存储文本都是用户自定义的
Cookie到哪里去?
此时浏览器已经保存了响应网址的Cookie值,当该浏览器再次访问该网站时,就会将cookie值保存在http请求的header中,一起发送给服务器。
为什么还要将Cookie返回给服务器?
Cookie里面可以存储每个客户端选择的信息。比如:服务器第一次将Cookie保存在客户端浏览器上时,浏览器就知道了服务器提供的信息有哪些,当浏览器再次访问服务器时,就可以选择适合自己的一个信息去访问。相当于是让每个客户端保存自己的偏好。
Cookie的重要键值对
(1)Cookie里面有一个很重要的键值对,成为key,是用来标识用户信息的身份信息的,就比如身份证或者就诊卡。
(2)在Cookie里面称为会话Id(sessionId)和会话(session),通过http请求中的sessionId,网页就可以响应回来相应的会话
(3)比如,当登陆上一个网页后,一定时间在打开该网页,就是直接展示登陆后的页面,不需要再次选择登陆,这就是Cookie的一个这样应用场景,称为自动登陆。
二、http响应报文
对于http响应报文,很多内容跟请求中的是一样的,所以重复的就不会再概述一遍,只会介绍和请求中不一样的。
1.响应报文格式
同样,对于响应报文来说,也由四个部分组成:首行 + 响应报头header + 空行 + 正文
每个部分和请求中的大同小异,粗略介绍
1.1.首行
这里和请求报文的首行不太一样了,响应报文的首行由三部分组成:版本号 + 状态码 + 状态码的描述
(1)版本号
这里的版本号和请求首行中的一样,都是指http协议的版本
(2)状态码
状态码,就是一个数字(三位数),描述了http请求是否成功,表示该响应是否成功
(3)状态码的描述
这里就是对状态码的描述,成功一般就是OK,失败一般就是有Not Found,这些都是程序员可自己定义的
1.2.响应报头header
这里和请求中的报头一样,都是由一些键值对组成
1.3.空行
和请求中的空行一样
1.4.正文
和请求中的正文一样,内容都是自定义的
2.响应报文内容
2.1.状态码
状态码,描述了本次http请求是否成功和失败的原因,通过保存在http响应中。
(1)200 OK
表示访问成功,最场景的一个状态码
(2)302 Move temporarily
表示临时重定向,当访问的是旧地址,却跳转到新地址上时
(3)403 Forbiden
表示客户端权限不足,无法访问该网址,被禁止访问
(4)404 Not Found
客户端请求的资源在服务器上不存在。比如url中的路径写错了。
(5)405 Method Not Allowed
请求中方法,服务器不支持
(6)500 Internal Server Error
表示服务器内部出现了错误
(7)504 Gateway Timeout
表示服务器访问超时,一般出现在多个客户端同时访问服务器的时候
状态码小结
200 | 成功 |
301 | 永久重定向 |
302 | 临时重定向 |
404 | 资源不存在 |
403 | 权限不够 |
405 | 方法不支持 |
500 | 服务器内部出现问题 |
504 | 服务器返回结果超时 |