写这篇东西的起因,是我前段时间带一个前后端分离项目,前端和后端在群里来回拉扯。前端说“我请求发了,没反应”,后端回“我这边日志里收到了,数据也返了”。两边都觉得自己没毛病,最后我让他们各自打开浏览器的F12开发者工具,把Network面板截图发出来。真相瞬间就清楚了——请求压根就没到后端,前端把接口地址拼错了。一个生产环境的联调问题,30秒定位完毕。
这个场景你应该不陌生。无论你是前端开发、后端开发、测试,还是刚学前后端分离的新人,F12开发者工具都是贯穿“客户端”和“服务端”之间最重要的一扇窗。它不抓包,不做代理,但它是浏览器这个客户端与服务器之间最透明的“通话录音”。这篇不从理论讲起,直接从F12的Network面板出发,把它和前端、后端、客户端、服务端之间的关系一层层拆开。看完你会明白:接口是谁发的、谁处理的、中间经历了什么、出问题该看哪里。
1. 在F12里看懂一次请求的完整链路
1.1 打开Network面板时,你其实在看一张“聊天记录”
很多新人打开F12Network面板会觉得乱——几十条甚至上百条请求,又是图片又是脚本,根本不知道看哪条。这里先建立一个认知:Network面板里每一行记录,都是浏览器这个客户端向服务端发起的一次HTTP请求。你可以把它理解成你和某人之间的聊天记录:你说了什么(请求),对方回了什么(响应),聊了多久(耗时),对方什么态度(状态码)。
这里的关键不是看行数多不多,而是学会用Type列分类。Type列显示的是资源类型:document是页面本身,stylesheet是CSS,script是JavaScript,xhr和fetch才是我们真正关心的接口请求。在前后端联调时,我通常直接在筛选器里点一下Fetch/XHR,整个面板立刻就干净了,剩下的全是接口。如果你连哪些是接口都分不清,说明你对网站结构的理解还停留在“打开一个页面”这种黑盒层面,而这篇文章正好帮你捅破这层窗户纸。
1.2 点击一条请求,看到的三个Tab分别对应什么
点开任意一条XHR请求,会看到Headers、Payload、Response三个主要标签页,这里值得花点时间说清楚。
Headers里能看到的是这次请求的完整信息:请求URL、请求方法(GET还是POST)、状态码,以及一堆请求头和响应头。初学者最容易忽略的是请求头里的Content-Type,POST请求传JSON格式时它是application/json,传表单时是application/x-www-form-urlencoded。后端接不到参数,三分之一的案例是前端Content-Type设置错了,或者后端接口要求的是JSON、前端传了表单。
Payload标签页在GET请求里可能叫Query String Parameters,POST请求里叫Request Payload。这里装的就是你发给服务端的“说出口的话”。Response标签页则是服务端返回给你的数据,F12会自动帮你格式化,比在控制台看一大坨字符串舒服得多。
我见过不少后端同学联调时根本不看Payload,只看响应,一旦参数对不上就归咎于前端。反过来,不少前端同学只会在控制台打日志,根本没意识去看网络层面发的到底是什么。这两类人都没把F12用完整。
1.3 从URL反推“谁发给谁”:前端、后端、客户端与服务端
理解前端和后端最简单的方式,是看一次请求的完整流向。
所谓前端,本质上是一段运行在用户设备浏览器里的代码。这段代码负责生成页面、监听用户操作,然后在某个时机发出一条HTTP请求。发出请求的浏览器在这里承担的就是客户端角色。所谓后端,是跑在服务器上的一段程序,它负责监听特定端口的请求,解析参数、处理业务逻辑、查数据库,最后把结果以HTTP响应形式返回给客户端。
F12的每一条请求记录,都是“客户端发起、服务端响应”这个闭环的证据。这个模型放在网页里叫浏览器和服务器,放在App里叫App客户端和API服务端,放在Redis环境里就叫Redis客户端和Redis服务端——通信模型是相通的。只不过浏览器里自带了一个如此强大的调试窗口,这算是前端开发的一个巨大优势。
1.4 状态码:后端给前端的“暗号”
我遇到过不少被状态码误导的新手,这里单独拎出来讲。
状态码是服务端对这次请求最直接的答复,它是一串三位数,按首位数字分家族。2xx表示成功,3xx表示重定向或缓存命中,4xx表示请求有问题(参数不对、未登录、没有权限、地址不存在),5xx表示服务端自己出了问题。重点说两个容易被误解的:
304 Not Modified不是错误,而是缓存生效。浏览器发现本地缓存还有效,服务端说“你可以继续用旧的”,于是不再重复下载内容。很多人在Network里看到304就以为报错了,其实这是正常的性能优化。
401和403的区别也经常搞混。401是未认证,意思是“你是哪位?先登录再说”;403是已认证但没有权限,意思是“我知道你是谁,但这件事你没资格做”
