目录
HTTP协议
工作最常用的协议之一 面试最常考的内容!!
使用HTTP协议的场景
①网页与后台服务器的交互
②app与后台服务器的交互
学习HTTP重点学习HTTP报文格式,与TCP/UDP/IP不同,HTTP是一问一答的结构模型,请求和响应的协议格式不同
如何查看HTTP请求和响应的格式呢?
使用抓包工具~ 推荐使用fiddler(本质上是一个代理)
加速器、vpn之类的也是代理,使用fiddler不能抓包,需要检查关闭代理软件(也可能是一个浏览器插件),还可以尝试不同的浏览器~
HTTP协议是文本格式的协议(TCP、UDP、IP是二进制格式的协议)
请求
①首行 有三部分 用空格分割
a.GET HTTP请求的方法
b.URL 唯一资源定位符,描述一个资源在网络上的位置
c.HTTP版本号
②请求头(header)
键值对结构数据,每个键值对独占一行,键和值之间用:空格分割,键值对都属于标准规定
③空行
请求头的结束标记
④正文(body)
有点HTTP请求有,有的没有
响应
①首行
a版本号
b.状态码(200) 描述了请求的结果
c.状态码描述(OK) 解释状态码
②响应头(header)
键值对结构数据,每个键值对独占一行,键和值之间用:空格分割,键值对都属于标准规定
③空行
响应头的结束标记~
④正文(body)
正文的内容比较长,可能是多种格式(html,css,js,json,xml,图片,字体,视频,音频)
URL
形象地理解url:
http://麦当劳餐厅:18/汉堡/双吉汉堡?酱=多&生菜=多
请求方法(method)
最最常用GET、POST,其他少用,不做具体区分
经典面试题:GET请求和POST请求区别
没有本质区别!!
但在使用习惯上有一些区别
①GET通常把要传给服务器的数据加到query string中,POST请求,通常把要传的数据加到body中(通常这样用,客户端和服务器使用一样的方式即可)
②语义上的差别
GET大多数获取数据
POST大多数提交数据(登录、上传)
GET和POST之间差别的一些误区~
①GET 请求能传递的数据量有上限,POST 传递的数据量没有上限 ❌
②GET 请求传递数据不安全, POST 请求传递数据更安全❌
(并不是POST数据放在body中就安全 黑客一样很容易获取)
③.GET 只能给服务器传输 文本数据,POST 可以给服务器传输文本 和 二进制数据❌
a.GET 也不是不能使用 body (body 中是可以直接放二进制的)
b.GET 也可以把 二进制的数据进行 base64 转码, 放到 ur 的 query string 中④GET 请求是幂等的. POST 请求不是幂等的 【不准确】
幂等:输入相同的内容,输出是稳定的,
GET 和 POST 具体是否是幂等, 取决于代码的实现,GET 是否幂等,也不绝对.只不过 RFC 标准文档上建议 GET 请求实现成幂等的⑤GET 请求可以被浏览器缓存,POST 不可以被缓存
(幂等性的延续,如果请求是幂等,自然就可以缓存)✔GET 请求可以被浏览器收藏夹收藏,POST 不能(收藏的时候可能会丟失 body)
Header
下面介绍几个header中重要的键值对
host:表示服务器主机的地址和端口
Content-Lenght:表示body中数据的长度
(HTTP在传输层基于TCP,所以会涉及粘包问题,对于GET这种没有body的请求,直接使用空行明确边界,对于POST这种有body的请求,结合空行和Content-Lenght)
Content-Type:表示body中数据的格式
(body中的格式有很多种 |请求:json、form表单格式、form-data格式|响应:html、css、js、json、图片)(给服务器提交请求,不同的Content-Type服务器处理数据的逻辑不同,服务器返回数据给浏览器,浏览器也会根据不同的Content-Type做出不同处理)
(请求中有body,才会有Content-Lenght、Content-Lenght属性)
User-Agent (简称 UA) :表示浏览器/操作系统的属性.
如今浏览器之间的差异非常小了,UA的作用没那么关键了,UA主要用来区分PC端还是移动端
Referer :表示这个页面是从哪个页面跳转过来的
(直接在地址栏输入url或收藏夹点击没有referer)
Cookie:可以认为是浏览器在本地存储数据的一种机制
浏览器的数据来自于服务器,浏览器后续的操作也是要提交给服务器的,服务器管理了一个网站的各种核心数据,但是程序运行过程中,也会有一些数据在后续请求的时候数据可能需要再发给服务器上次登陆时间.上次访问时间.用户的身份信息,累计的访问次数....(临时性的数据,存储在浏览器比较合适)
Cookie 往往是从服务器返回的数据(也可以是页面自己生成的)
Cookie 存储到浏览器所在主机的硬盘上,并且是按照 域名 为维度来存储的,(每个域名下可以存自己的 Cookie,彼此之间不影响)
Cookie 是按照键值对的形式来组织的(程序猿自定义)后续再请求这个服务器的时候,就会把 Cookie 中的内容自动代入到请求中,发给服务器,服务器通过 Cookie 的内容做一些逻辑上的处理
响应状态码
404 Not Found请求中访问的资源,在服务器上不存在
403 Forbidden表示访问的资源没有权限
特殊的状态码,418lam a teapot!(杯具) “彩蛋”
(3重定向:访问A地址时,响应返回一个重定向报文,告诉你应该访问B地址)
典型面试题:说说常见HTTP状态码
服务器如何处理一个HTTP请求?(Servlet、Spring)【重点】(后续会介绍)
客户端如何构造一个HTTP请求?
①浏览器地址栏输入url
②html中的特殊标签触发(img、a、link、script...)
③form表单触发
④ajax
我们可以使用更简单的方式构造http请求,使用postman图形化界面