尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

HAR文件从打开到分析:五分钟定位接口问题

HAR文件从打开到分析:五分钟定位接口问题 你正改着需求同事突然在你工位上甩来一个文件后缀名是.har嘴里还念叨着“接口返回不对你帮我看看这个抓包文件”。你双击了一下发现浏览器打开了满屏的 JSON 字符串像天书一样完全无从下手。这种场景我见得太多了甚至不少干了两三年的开发遇到别人发来的 HAR 文件还是一脸懵只会用CtrlF在里面搜关键字。实话说HAR 文件没有想象中那么神秘。它本质上就是一种记录浏览器和服务器之间全部 HTTP 交互的标准化格式只要你掌握了打开姿势和关键字段的阅读方法哪怕是一个几百兆的超大抓包文件也能在几分钟内定位到问题根因。这篇内容我就把 HAR 文件从“是什么”到“怎么打开”再到“怎么接着分析”整个链路都捋一遍重点讲别人发来的文件你如何快速上手、定位问题还有我们在实际排查中踩过的各种坑。无论是前端、后端、测试还是运维同学这篇都值得收藏。1. HAR 文件到底是个什么东西1.1 为什么一个 JSON 文件能成为抓包标准HAR 的全称是 HTTP Archive看名字就知道了它是专门用来归档 HTTP 请求记录的。这个格式最早由网景的工程师提出后来交给了 W3C 下的 Web Performance Working Group 维护。之所以它能成为事实标准核心原因是它把一次页面访问过程中的所有网络请求按照时间顺序、层级关系、请求响应详情全部结构化地记录在了一起。你可以把它理解成黑匣子。飞机上的黑匣子记录的不只是“飞机飞了一圈”而是每个时刻的高度、速度、油门、舵面角度。HAR 也是这样它记录的不仅仅是“这个页面请求了 50 个接口”而是每个接口的完整请求头、请求体、响应头、响应体、耗时、Cookie、缓存状态、本地 IP 端口、远程 IP 端口等等一连串信息。而且这个格式是纯文本的底层就是一个大大大的 JSON 对象。意味着什么意味着任何一门语言都能解析它任何一个人用记事本也能打开它虽然打开后大概率是满屏乱码般的长文本。跨平台、跨工具、跨团队传递非常方便这也是为什么别人能随手发一个 .har 文件给你你就能完全复现他当时遇到的所有网络问题。1.2 HAR 文件的内部结构一次看懂虽然 HAR 是 JSON但如果你直接拿记事本打开大文件下电脑都可能卡死。我们先不急着打开实际文件先看看它的骨架结构。顶层是一个名为log的对象内部大概长这样{ log: { version: 1.2, creator: { name: Chrome, version: 119.0.0.0 }, pages: [], entries: [ { startedDateTime: 2024-01-15T10:30:00.000Z, time: 238.5, request: {}, response: {}, cache: {}, timings: {} } ] } }翻译成人话就是version告诉你是哪个版本的 HAR 规范creator告诉你这是用什么工具导出来的entries才是真正的核心数组里面每一个元素代表一次完整的 HTTP 事务也就是一个请求从发出到收到响应的全过程。再往里面抠一下每个entry里你只需要盯住这四个关键字段request记录请求方法、URL、HTTP 版本、请求头Headers、请求体PostData、Cookie 等你想看的入参都在这里。response记录响应状态码、状态文本、响应头、响应体、重定向 URL 等出参和报错信息在这里。cache记录缓存命中情况。timings记录这个请求每个阶段消耗的时间。所以你看HAR 文件虽然是纯文本但它的结构很有逻辑。弄清楚这些字段后你就不需要“全文搜索”了而是带着目的去特定的字段里找答案。2. 别人发来的 HAR 文件不同场景用什么方式打开2.1 不想装任何软件浏览器开发者工具直接拖进去如果你手头没有 Fiddler、Charles 这类专用抓包工具最快的方案是直接用 Chrome 或 Edge 的开发者工具。操作路径很短打开 Chrome按F12进入开发者工具。切换到Network网络面板。鼠标空白处右键选择Load HAR file...或者直接把.har文件拖拽到 Network 面板里。拖进去之后整个列表就会变成对方导出时的样子里面包含了所有请求的 URL、状态码、耗时、大小点击任意一条可以查看详细的 Headers、Payload、Response 和 Timing 数据。我这个方法在日常协作中用的频率最高因为它零成本不需要额外装工具。公司新来的同事电脑上啥都没有我发个 HAR 过去一句话“你拖到 F12 的 Network 里”就完事。这里需要特别提醒的是浏览器开发者工具的 HAR 导入功能虽然方便但它存在一个典型限制它只能导入不能编辑和重新导出。你导入后做不了任何标记和注释关掉浏览器就没了。对于深度分析场景后面会讲到专业工具。2.2 格式不标准或文件过大用文本编辑器兜底虽然 HAR 的标准结构是固定的但实际你在工作中收到的文件往往是五花八门的。有些工具导出的字段命名不规范有些文件甚至被人手动改过、截断过。这种非标准文件用浏览器开发者工具导入时大概率会报Failed to load HAR file的错误。这时候别慌直接用 VS Code 打开。不是让你肉眼盯着无穷无尽的 JSON 看而是利用 VS Code 的JSON: Open功能或者安装一个名为JSON Tools的插件对整个文件做格式化把压缩成一行的 JSON 展开成树状结构。格式化之后用快捷键CtrlF搜索关键字比如接口路径、状态码、某个报错文本。VS Code 对大文件的支持比记事本好得多500MB 以内的文件它都能抗住。如果你是 Mac 用户也可以直接用 Xcode 自带的工具或者 SubEthaEdit原理一样核心就是找一个能处理大 JSON 的编辑器。另外如果你的电脑实在卡还有一个骚操作先把文件用命令行按行拆分再打开。# 把 HAR 文件按行拆开每 5000 行一个文件 split -l 5000 output.har part_拆分之后你可以在拆分文件里精准搜索某个时间段或某批请求。这个办法看起来原始但实测对超大文件排查特别有效。2.3 在线工具临时分析首选但不建议传敏感内容在线分析工具是另一个高频选择。不少团队在群里互传 HAR 时收到的人没有专业抓包工具也不想装 VS Code那就直接拖到网页上。我常用的在线工具有两个HAR Analyzer由软件工程师 Eric Lawrence 开发他是 Fiddler 的作者这个工具打开后能从时间线、请求列表、资源类型、耗时分布等维度做自动可视化分析体验接近一个轻量级独立软件。HTTP Archive Viewer可以直接把 HAR 转成直观的瀑布图对性能分析场景特别友好。不过这里我必须强调一句话抓包文件里往往包含了大量的 Cookie、Token、Authorization 头、请求体明文这些东西是非常敏感的数据。你永远不该把别人的线上环境 HAR 文件传到你不清楚数据流向的第三方在线工具上。公司内部自建的工具可以公共互联网的工具务必脱敏后再传。怎么脱敏我后面专门开一小节讲。3. 打开之后怎么接着分析核心技巧和实操思路3.1 先看整体时间线和瀑布流明确问题方向文件加载进工具之后我建议你先不要点开任何一条请求去抠细节而是先看整体。这个习惯可以帮助你迅速判断问题出在“页面加载慢”还是“某个接口报错”上。Chrome 开发者工具导入 HAR 后Network 面板顶部会显示一个总览区域Overview那个横向的时间轴就是所有请求的瀑布图。正常情况下瀑布图上的条条是错落分布的先是 HTML 文档请求然后是 CSS、JS、图片再是异步接口请求。如果你看到某一条请求前面有一大段空白或者整个瀑布图拥挤在一起基本能判定对方当时的网络环境有问题比如跨网络访问时偶尔会出现的弱网、丢包导致的连接超时。如果瀑布图分布正常但页面还是“慢”问题大概率在后端逻辑或业务代码上。这时候你就不该在 HAR 上继续死磕了而应该拿着请求参数去后端看日志。HAR 可以帮你定位“慢在哪”但不一定能直接告诉你“为什么慢”这个边界心里要清楚。3.2 从 URL、域名和状态码三个维度快速筛选面对几十上百条请求一条条看肯定不现实。我自己的习惯是分三步走第一步先按域名分组。Chrome 的 Network 面板没有原生分组功能但你可以直接在筛选框中输入域名关键词比如api.example.com这样很快就能把业务接口和静态资源分离出来。第二步按状态码过滤。重点关注非 2xx 的请求特别是 4xx 和 5xx。4xx 多是参数错误、鉴权失效、资源不存在5xx 多是服务端异常。通过状态码分布你能快速勾勒出故障概貌——是单接口挂掉还是集体 500。第三步按耗时排序。点击 Time 列头可以让请求按照耗时从高到低排列。耗时最长的 Top 5 一般就是问题的核心嫌疑对象。这三个维度做下来一个大而全的 HAR 文件就会被压缩成一个范围很小的“嫌疑人名单”你会清晰很多。3.3 单条请求的深度阅读技巧到了看单条请求的时候很多人容易迷失在 Headers、Payload、Response 那一堆标签页里。我用一个实际项目中的例子来带你走一遍完整流程。假设 H5 页面里有个“用户信息查询”接口报了 500对方发来了 HAR。我会按以下顺序操作在列表里选中这条请求先看Request Headers里的关键字段比如Cookie、Authorization。如果 Cookie 缺失或者 Authorization 过期后端返回 401 是正常的别急着提 bug 单。再看Query String Parameters和Request Payload。确认前端实际传的参数和你接口文档定义的是否一致。我遇到过很多次开发同事说“后端出 bug 了”结果一看 HAR前端把手机号字段传成了mobile而后端接口定义的是phone这就是典型的传参不一致和接口本身没关系。然后看Response这是最关键的。看响应体之前先看Response Headers里的Content-Type。如果期望application/json实际却返回了text/html大概率是服务端发生了内部错误返回了错误页。最后切换到Timing选项卡看耗时分解。整个流程的关键点在于通过 HAR 判断问题时永远优先看请求参数和响应体其次才是看状态码。状态码只告诉你“结果不对”但参数和响应体才能告诉你“为什么不对”。3.4 读懂timings字段定位性能瓶颈在哪一段很多人拿到 HAR 只看状态码和接口返回值忽略了一个对性能排查极有价值的字段timings。这个字段记录了请求从发出到最终完成的每个阶段耗时。打开一条请求的 Timing 面板你通常能看到这样几个阶段Blocked浏览器在队列里等待的时间比如有请求数量限制时前面的请求没结束后面的请求就只能排队。DNS Lookup域名解析时间正常情况下应该极短如果这个值特别大说明本地 DNS 配置可能有问题。Connecting建立 TCP 连接的时间包括 TCP 三次握手。TLS HandshakeHTTPS 建立安全连接的时间。Sending发送请求数据的时间。Waiting (TTFB)浏览器发出请求后到接收到服务器返回的第一个字节的时间。这是最核心的指标它反映了服务器处理和网络往返的时间总和。Receiving接收服务器返回数据的时间主要和响应体大小、网络带宽有关。如果一个接口Waiting时间特别长达到几百毫秒甚至几秒那问题基本可以判定在服务端处理逻辑或网络传输延迟上。这时候你把 HAR 里的timings截图发后端比发一整份 HAR 文件更能快速说明问题。3.5 从 HAR 里翻出失败请求的响应体别只看控制台报错还有一个很常见的场景对方说“页面上有个按钮点了没反应”然后甩来一个 HAR。你打开后可能会发现浏览器控制台里什么都没报错但实际有一个接口返回了 4xx/5xx。为什么控制台没暴露因为很多前端代码并没有对fetch或XMLHttpRequest的异常做全局捕获报错被吞掉了。这时候唯一能看到真相的地方就是 HAR 里的响应体。比如有一次对方说某个页面白屏HAR 里看到一个接口返回 302跳转到了一个登录页。但从瀑布图上看资源并没有少只是 HTML 里渲染关键内容的接口被重定向了。我点开这条请求看到Response Headers里的Location字段指向了一个 SSO 登录地址立马判断出是登录态失效。要是只看控制台这个问题大概率会被定位成“前端 JS 报错”找半天找不到。所以我建议你拿到 HAR 后养成一个习惯把所有非 2xx 请求全部点开看一眼响应体。多数真正有价值的线索都在里面而不在“状态码”里。4. 工具选型和团队协作的实战经验4.1 不同工具怎么选浏览器、Fiddler、Charles 各有适用场景收到别人发的 HAR 之后用哪种工具继续分析最好不要“谁在我眼前就用谁”而是根据你接下来的任务目标来定。这里我做了一个对比表格按场景选型最靠谱。工具优点缺点适用场景Chrome / Edge 开发者工具零成本、操作快、支持拖拽导入编辑功能弱大文件导入卡顿日常快速定位、接口调试Fiddler Classic / Fiddler Everywhere支持多会话管理、可以修改 HAR 并重新导出、有 Composer 调试功能界面偏老旧新版本收费需要做二次请求调试、构造参数复测Charles代理抓包强同样支持导入 HAR界面直观收费软件启动偏重Mac 用户做移动端抓包和深度的接口调试VS Code JSON 插件可以处理超大文件搜索替换强无法可视化瀑布图非标准 HAR、超大文件、手工改数据在线工具HAR Analyzer可视化分析全面无需安装适合快速看概貌有敏感数据泄露风险脱敏后的文件、非生产环境数据我个人日常最常用的组合是先用 Chrome 导入快速看整体如果需要改参数重放一次请求就把 HAR 导入到 Fiddler 里做二次编辑。这个组合在绝大多数场景下已经足够了不用被工具本身绊住手脚。4.2 一份好用的 HAR 文件导出前要做这些准备从协作角度说给对方发 HAR 之前最好先做一次“预处理”这会让你在别人眼中专业得多。我自己发 HAR 文件时基本都走下面这套流程第一步清除冗余请求。Chrome 导出的 HAR 是默认包含所有请求的包括一堆第三方统计脚本、广告请求、埋点日志。这些请求对分析核心功能没有帮助还会拉高文件体积。我通常会用过滤框先把核心域名筛出来然后导出时只保留过滤后的结果。这一步在浏览器导出 HAR 时没有原生支持需要借助 Fiddler 等工具或者手动在 HAR 里删掉无关entries。第二步脱敏处理。用编辑器打开 HAR把所有出现Authorization、Cookie、token、password等敏感字段的值替换成***或者直接把整个敏感 Header 删掉。如果响应体里有用户手机号、身份证等个人隐私信息也一并替换。第三步压缩文件。HAR 是纯文本压缩率很高。用命令gzip -k filename.har就能变成.har.gz体积能缩小到原来的五分之一发送时更快。收件人解压后打开效果和原来一样。4.3 超大型 HAR 文件的拆解思路HAR 文件并不总是几十 KB 的小文件。如果你排查的是一个复杂的单页应用或者是一个持续抓了十几分钟的埋点环境文件动辄一两百 MB 很正常。这么大的文件用浏览器导入基本会卡死或崩溃这时候就要换个思路。我的做法是写一段简单的 Node.js 脚本把大 HAR 按某个维度拆分成几个小文件。比如按域名拆、按时间范围拆、按接口关键字拆。核心逻辑很简单const fs require(fs); const har JSON.parse(fs.readFileSync(input.har, utf8)); const keyword process.argv[2] || api; const filtered { ...har, log: { ...har.log, entries: har.log.entries.filter(e e.request.url.includes(keyword)) } }; fs.writeFileSync(filtered_${keyword}.har, JSON.stringify(filtered, null, 2));把脚本跑一下传入你关注的关键字生成的新 HAR 可能就只剩几十条请求了想怎么分析都行。这种小工具在团队里流转开了之后分析效率能提升一大截。5. 常见问题与排查技巧实录5.1 拖进浏览器提示 “Failed to load HAR file” 怎么办这可能是最常见的报错。原因大概有四种文件不是合法的 JSON、文件里的字段格式不标准、文件被压缩成了 gzip 但扩展名没改、或者文件太大导致浏览器解析超时。我的排查顺序是先用 VS Code 打开文件看第一行是不是{。如果文件是加密的、或者被某些 IM 软件改名过第一行大概率不是标准 JSON。如果确认是 JSON再看文件里entries字段是否存在并且是不是数组。如果entries被误改成了对象浏览器就会报错。这时候只需要用编辑器修正成数组格式就能正常导入。还有一个隐蔽问题某些旧式代理工具导出的 HAR 文件编码不是 UTF-8而是 UTF-8 with BOM 甚至 GBK。浏览器在处理带 BOM 的 JSON 时容易出问题。用 VS Code 打开后右下角点击编码方式重新选择Save with Encoding为 UTF-8 保存一遍问题通常就解决了。5.2 响应体看不到内容全是乱码或者中文变成了\uXXXX这种情况不是文件坏了而是导出工具对响应体做了编码或转义处理。HAR 规范里允许响应体以 Base64 编码存储所以你在 JSON 里看到一串看不懂的base64字符串其实那里面可能是完整的 HTML 或 JSON 数据。如果对方是用浏览器开发者工具导出的一般响应体是原文存储能直接看。但如果对方是用 Fiddler 或者 Charles 导出的响应体可能会以 Base64 存储在response.content.text字段里。遇到这种你需要先做一步解码echo base64_encode_content_here | base64 --decode另外JSON 里的 Unicode 转义字符如\u5f20\u4e09其实是“张三”这两个字只是被转义了。VS Code 默认不会自动解码你可以在打开的编辑器里按CtrlShiftP搜索转换转义字符装一个叫Json Escape的插件就能一键解码或者直接复制到在线转义工具里处理。5.3 导入后请求时间都是乱的无法还原当时现场一个我见过很多次的误区把 HAR 文件导入工具后有人会认为请求列表的排序是乱掉的。实际上HAR 文件里的startedDateTime字段记录了每条请求的发起时间正确导入后工具应该按这个时间排序。如果你看到的顺序和对方当时看到的不一致多半是你用了不同的导入方式或者工具做了按状态码/域名排序。用 Chrome 导入的话它在导入之后默认按时间排序这点不用担心。如果你需要精确还原某条请求前后的顺序可以点击开发者工具的“时间”列头做一次排序。但要注意HAR 记录的是客户端发起请求的时间如果两条请求是并发发出的它们的先后顺序只相差几毫秒此时你想靠时间戳判断“谁先谁后”其实并不准确必须结合业务逻辑去推断。5.4 页面接口有缓存HAR 里看不到最新请求怎么办有时你希望 HAR 能完整反映一次操作的所有网络请求但打开后发现某些接口使用了缓存在 HAR 里只有一条记录而且cache字段显示命中。这种情况尤其容易出现在静态资源JS、CSS、图片上但有时候业务接口也会因为 HTTP 缓存或 Service Worker 而没有真正发出去。如果你需要的是“完整请求记录”最好的办法是让对方先强刷页面CtrlShiftR再抓包导出。如果是接口层面被浏览器缓存干扰请在发送请求时加上Cache-Control: no-cache或者给 URL 追加一个随机参数比如?_t123456强制绕过缓存。5.5 如何判断问题是前端还是后端这是我近十年最常用的绝招这个判断方法在团队扯皮时异常有用。拿到 HAR 之后盯着那条异常的请求如果请求压根没发出去HAR 里没有这条请求说明是前端代码没有调用接口问题在前端。如果请求发出去了但请求的参数缺失或格式不对那大概率是前端传参有误。如果请求参数完整、请求头正常但响应状态是 4xx优先看服务端返回的错误信息体这种多数是业务参数校验问题或鉴权问题。如果状态是 5xx或者timings里 Waiting 时间异常长那问题十有八九在后端。还有一种极特殊的响应体是网页登录页的内容或一个跳转脚本这是登录态失效的表现前后端都别急着背锅先确认会话策略。这个方法基本能帮我十分钟内锁定责任方。它不是高深的技巧但非常实用团队协作中能帮你少开很多无谓的“扯皮会”。5.6 拿到 HAR 不要直接全文搜索先看这 4 个字段在正文最后再补一个独家习惯。很多人收到 HAR 后第一反应是CtrlF搜报错关键字比如搜“error”或“exception”。但 HAR 里所有的响应体都是原文一旦报错信息不在响应体里而在状态码或请求路径中你搜关键字是搜不到的。我的标准动作是看完瀑布图之后直接翻四个字段response.status定位状态码异常的请求。request.url定位 URL 中明显异常的请求路径或参数。response.content.mimeType看返回类型是不是和接口约定一致。timings.wait找耗时异常高的请求。这四个字段翻过一遍整个 HAR 文件的基本情况就了然于胸了接下来再针对性点开具体条目效率会高别人一个量级。最后再分享一个我自己的习惯现在每次收到别人发来的 HAR 文件我都不会直接拿浏览器导入而是先看一眼文件大小。超过 20MB 的先拆再导不到 20MB 的直接用 Chrome 拖进去看三件事瀑布图分布、非 2xx 请求、慢请求的 timings。整套流程走下来基本 5 分钟内能给出一个初步判断。如果有条件我建议各位让团队里每个人都学会导出和分析 HAR。这玩意儿看起来只是“一个 JSON 文件”但在跨端问题排查、前后端联调、线上故障复盘里它就是把案发现场原封不动搬到分析桌上的唯一凭证。你掌握得越熟练遇到问题的时候就越从容。下次再有人在工位上甩一个 .har 文件给你你就可以淡定地回一句“放这儿吧给我五分钟。”
返回列表