文章目录
HTTP协议
- HTTP 理论和实践同样重要。如果我们未来写web开发(写网站)。HTTP就是我们工作中最常用到的东西。
- 什么是HTTP?
HTTP是应用层的协议,HTTP现在大规模使用的版本是 HTTP/1.1 - 使用HTTP协议的场景:
1.浏览器打开网站(基本上)
2.手机APP访问对应的服务器(大概率)
报文格式
- HTTP最重要的就是报文格式了
- HTTP的报文格式和 TCP/IP/UDP 这些不同,HTTP 的报文格式,要分两个部分来看待
请求和响应
HTTP协议,是一种 一问一答 结构模型的协议,请求和响应的协议格式,是有所差别的
这里也不只有一问一答的模型结构:
一问一答(访问网站)
多问一答(上传文件,把请求拆分成多份传给服务器)
一问多答(下载文件,把响应拆成多份进行下载)
多问多答(串流 / 远程桌面,远程桌面就是这边操作了,那边就会有响应)
- 如何查看到 HTTP 请求和响应的格式呢?
抓包工具:把网卡上经过的数据,获取到,并显示出来(这个是我们必备的技能,分析和调试程序的重要手段)
Fiddler
抓包工具:
wireshark:功能非常强大,可以抓各种各样的协议,使用起来比较复杂,但是用这个抓 HTTP 是不太方便的
Fiddler工具:是专门用来抓HTTP的,使用起来简单,企业中也经常用到
在官网下载Fiddler Classic 版本的就可以
FIddler的请求和响应,还要下载证书,否则就只抓包http了,不能抓https了

安装证书:
出现这个点cancel就行
- Fiddler 本质上是一个 代理,可能会和其他的代理软件冲突
举个栗子:
除了 fiddler 之外,有的程序也是代理
(1) 加速器
(2) vpn
...
这些代理程序之间可能会产生冲突
如果你的 fiddler 不能抓包了,一定要检查关闭之前的开启的代理软件(也可能是一个浏览器插件),如果还是不行,还可以尝试换一个浏览器,有的时候 edge浏览器 可能会不行,比如出现下面这样的情况
postman 是构造请求的软件
fiddler 是抓取/显示已有的请求的软件
- ctrl + a:选中所有的请求,delete删除这里所有的请求,方便后续观察想要观察的http
- HTTP 协议是文本格式的协议 (协议里面都是字符串)
TCP,UDP,IP...都是二进制格式的协议
**HTTP 响应也是文本的。直接查看,往往能看到二进制的数据(压缩后的),HTTP 响应经常会被压缩。因为压缩之后,体积更小,传输的时候,节省网络带宽。**但是,压缩和解压缩,是需要消耗额外的 cpu 和 时间 的。其实也没关系,一台服务器,最贵的硬件资源就是网络带宽,这样压缩和解压缩就是用便宜的换贵的
解压缩之后,可以看到,响应的数据其实是 html,浏览器上显示的网页,就是html,往往都是浏览器先请求对应的服务器,从服务器这边拿到的 网页 数据(html),每次访问网页,都会下载对应的网页数据,会消耗一定的带宽(不像我们下载APP一样,只需要下载一次)

- 请求:
键值对这里是 标准规定 的,所以不能自己胡编乱造
- 响应:
URL
- URL 是计算机中的非常重要的概念,不仅仅是在 HTTP 中涉及到
jdbc
设置数据源
setUrl("jdbc:mysql://127.0.0.1:3306/java1?characterEncoding=utf8&useSSL=false");
setUser
setPassword
URL,描述了某个资源在网络上的所属位置。数据库也是一种资源
- URL的具体信息:
1.协议方案名(协议名):例如,https:// ,jdbc:mysql://
2.登录信息(认证):这个东西现在几乎不会用到了(尤其是针对用户的产品)
3.服务器地址:可以 IP地址,也可以是 域名
4.服务器端口号:
5.带层次的文件路径:
6.查询字符串(query string)
关于以上 url 的几个部分(query string),举个例子:
对于 query string 来说,如果 value 部分要包含一些特殊符号的话,往往需要进行 urlencode 操作
比如:
搜索C++这个词
后面使用 url 的时候,要记得针对 query string 的内容进行好 urlencode 工作。如果不处理好,有些浏览器就可能会解析失败,导致请求无法正常工作
中文汉字也需要转义,如果不转义的话,汉字也出现特殊的符号的话,不就bug了
7.片段标识符:比如说这个网址就有 [vue技术文档],片段标识符实现页面内部的跳转 (https://cn.vuejs.org/guide/introduction.html#the-progressive-framework)
请求
方法
- 方法既有 GET 还有POST,出现最多的还是GET,POST出现的比较少

POST请求
POST
(1) 登录
(2) 上传文件
习惯用法(不是硬性规定,也可以不遵守的)
这个不遵守的话,客户端和服务器都要一起不遵守的,不然会出现问题
GET 请求,通常会把要传给服务器的数据,加到 url 的 query string 中。
POST 请求,通常把要传给服务器的数据,加到 body 中
登录和上传头像的请求

出现蓝色的字体(在刚开始加载网页的时候出现的,后续Fiddler删除这些包,就不会出现了),是获取到网页(得到 html 的响应)
对于浏览器缓存的理解:
刚才最开始没有抓到这里的返回的请求,是因为命中了浏览器的缓存
存在网络缓存的原因:
浏览器显示的网页,其实是从服务去这边下载的 html。html 内容可能会比较多,体积可能比较大,通过网络加载,消耗的时间就可能会比较多。
浏览器一般都会自己带有缓存,就会把之前加载过的页面,保存在本地硬盘上。
下次访问直接读取本地硬盘的数据即可。
缓存可能出现的bug:如果缓存的是之前未修改的网页,缓存之后又修改了网页,就可能会出现bug
上传图像的body本身是比较长的
- 方法的种类:
这些HTTP请求最初的初心是为了表示不同的 语义(不同的含义),现在在实际的使用过程中,初心,已经被遗忘了。HTTP的各种请求,目前来说已经不一定完全遵守自己的初心了,实际上程序员如何使用,更加随意了
比如:还可以用GET来上传文件,用POST获取文件,也是可行的
还有 POST和 PUT 目前来说,可以理解成 没有任何的区别!!!(任何使用 POST 的场景,换成 PUT 完全可以,反之亦然)
GET 和 POST 的区别
经典的面试题:GET 和 POST 的区别
GET 和 POST 之间的差别,网络上的有些说法,需要大家来注意!(都是错误的说法)
- GET 请求能传递的数据量有上限,POST 传递的数据量没有上限
- GET 请求传递的数据不安全,POST 请求传递的数据更安全
安全关键在于是否加密了
- GET 只能给服务器传输 文本数据。POST 可以给服务器传输文本 和 二进制数据
(1) GET 也不是不能使用body(body 中是可以直接放二进制数的)
(2) GET 也可以把 二进制的数据进行 base64 转码(转码成字符串的文本文件),放到 url 的query string 中,之后再解码,不也是二进制的数据吗
下面说法不够准确,但是也不是完全错的
1.GET 请求是幂等的。POST 请求不是幂等的。
幂等:数学概念,输入相同的内容,输出是稳定的。
举个栗子:
吃进去的是草,挤出来的是奶。如果任何时候吃草,挤出来的都是奶,就是幂等的。如果吃草之后,不同时候挤出来的东西不一样,就不是幂等的。
GET 和 POST 具体是否是幂等的,取决于代码的实现。GET 是否幂等,也不绝对。只不过 RFC 标准文档上建议 GET 请求实现成幂等的。
再举个例子:
不同的时间,广告的顺序都可能会不同
Header
有哪些常见的Header,理解Header的含义
- HOST
HOST:www.sogou.com
HOST后这个信息在 url 中也是存在的
比如,在使用代理的情况下,Host 的内容是可能和 url 中的内容不同的
- Content-Length:body 中数据的长度
Content-Type:body 中数据的格式
注意:请求中有 body,才会有这两个属性。
通常情况下 GET 请求没有 body,POST 请求有 body
body 中的格式,可以选择的方式是非常多的
body中数据的格式:
请求:
1.json
2.form 表单的格式:相当于是把 GET 的query string 给搬到 body 中。(后面写个代码来构造一个)
上传图片:
3.form-data 的格式:上传文件的时候,会涉及到(也不一定就是 form-data,也可能是 form 表单)
响应:

后续给服务器提交请求,不同的 Content-Type(body),服务器处理数据的逻辑是不同的。
服务器返回数据给浏览器,也需要设置合适的 Content-Type,浏览器也会根据不同的Content-Type 做出不同的处理
- User-Agent(简称UA)
UA是用来区分不同的设备的 ,上古时期的UA是用来区分浏览器的兼容问题的,可以让旧的浏览器支持文字,让新的浏览器支持图片,这样也就区分开了
现在 UA 使用来区分是PC端还是 移动端的
- Referer:描述了当前页面是从哪个页面跳转而来的
如果是直接在地址栏输入 url(或者是点击收藏夹中的按钮)都是没有 Referer
Referer的用途:这个也可以用来算钱的
搜索引擎,每点击一次,它都会赚钱
通过域名来区分是百度投放的广告,还是搜狗投放的广告

- Cookie
Cookie可以认为是浏览器在本地存储数据 的一种机制
对于安全性的考虑,所以引入了Cookie ,存储简单的字符串也是够用的
Cookie是怎么进行存储的(重点)
浏览器中的 Cookie
Cookie的作用:
Servlet / Spring 中会结合代码更深入地理解Cookie
响应
状态码
- 响应 状态码
表示了这次请求对应的响应,是啥样的状态(成功,失败,其他的情况,对应的原因是什么)
这里的状态码,种类非常多。咱们不需要全都记住
成功
2xx 都表示成功,200是最常见的
重定向
3xx 表示重定向,(可以理解为爱情转移)
请求中访问的是 A 这样的地址。响应返回了一个重定向报文,告诉你应该要访问B地址
举个例子:
比如你请教一个老师,老师说这边还没有空,叫你去找另一个老师,如果还不行的话,再来找我
301和302
301 Moved Permanently是永久重定向,是有缓存的,比如你地址就在新的网站了,以后就不要访问旧的网站了
302 Move tmporarily 是临时重定向,是没有缓存的,指不定后面又要更改,比如说你地址在新网站了,但是可能后面又会改回旧的网站
重定向的响应报文中,会带有Location字段,描述出当前要跳转到哪个新的地址
(后面会在代码中具体演示)
请求错误
客户端,也就是浏览器(客户端)会构造一个http请求,不符合服务器的一些要求
404 Not Found
请求中访问的资源,在服务器上不存在
比如:
HTTP/1.1 404 Not Found
404这个状态码表示的是自愿不存在,同时在 body 中也是可以返回一个指定的错误页面的,很多网站会把这个错误页面做的很丰富多彩
比如:bilibili
403 Forbidden
表示访问的资源没有权限
服务器错误
5xx 表示服务器出错了
看到这个说明服务器挂了
比较容易出现的是500,后面我们自己写服务器的时候,还是比较容易写出500这样的问题的(一般就是你的代码有bug)
一个经典的面试题:说一下,HTTP的状态码有哪些常见的
通过不同的数字来表示状态,这种做法其实是非常常见的(在C语言中也有,比如 errno,表示打开文件失败的原因, strerror 把errno翻译成字符串)可能我们面试中也会考察C语言的

如何让客户端构造一个HTTP请求
如何让服务器处理一个HTTP请求,这是非常重要的内容(Servlet/Spring中都会涉及到这一部分)
浏览器:
- 直接在浏览器地址栏输入url,此时构造了一个GET请求
- html中,一些特殊的html标签,可能会触发GET请求,比如像 img,a,link,script...
- 通过form表单来触发GET/POST请求(我们需要了解一下),form本质也是一个HTML标签
写一个简单的html代码,来编写逻辑(解释form的逻辑)
form表达如何编写?使用form标签
设置提交按钮:
构造GET请求:
构造POST请求:
- ajax的方式

1.引入jquery库(第三方库,是需要额外下载引入的)
前端引入第三方库非常容易的,只要代码中写一个库的地址即可
jquery cdn中有一些资源和库
2.编写代码
回调函数:
js中定义变量:
ajax的get请求写法:
ajax的post请求写法:
构造请求还有更简单,更方便的方式,比如使用第三方工具,可以实现这里的效果。
form能够构造get和post请求,ajax也能构造get和post请求。上面的知道这些就可以了,等学了前端来看才能够懂!!!
一种更简单的构造HTTP请求的方式
直接通过第三方工具,图形化的界面来构造。我们这里使用postman
- 先创建一个Workspaces,然后创建标签页
- 请求的设定,最后发送请求
postman 也是我们常用的构造请求的方式,一般是用于测试阶段
不会写ajax也没事,postman都会给你自动生成代码,就在右上角的code按钮
HTTPS
- 引入HTTPS的原因:
- 使用HTTPS进行加密,也是为了防止运营商劫持,还有比如在商场你连商场的wifi,也可能会被黑客截获数据,黑客把wifi伪装成商场的wifi一样的名字