
说实话以前但凡有人问WebSocket接口怎么调试我第一反应都是开浏览器F12在Console里new WebSocket()然后写点脚本收发消息。这个路子能用但体验真的很一般你要保存消息记录得自己拼代码想带个自定义Header得先处理浏览器限制换环境改个地址还要翻代码。后来发现Postman早就内置了WebSocket测试能力很多同事还停留在Postman只能测HTTP的印象里这篇就专门聊聊怎么用Postman测WebSocket接口以及我在实际联调中踩过的那些坑。这篇文章适合谁后端开发要联调实时服务、前端要验证推送逻辑、测试同学要做接口验收都值得看一下。不需要你有多深的WebSocket基础跟着操作一遍就能上手。1. 为什么测试WebSocket不能沿用HTTP的思路1.1 HTTP是你问我答WebSocket是拉条专线想用好Postman测WebSocket第一步不是打开软件而是先把思维从HTTP切到WebSocket来。我把这两者的区别打个比方HTTP就像发短信你发一条服务器回一条一来一回问完了这次通信就结束WebSocket更像是打电话你先拨号握手接通之后双方可以随时说话谁也不用等谁直到某一方挂断。这个区别直接决定了测试方法。用Postman测HTTP接口核心动作是填URL、点Send、看Response一次请求对应一次响应链路是短的。但WebSocket不一样你点了Connect之后这个连接会一直挂着服务端可能在任意时刻主动往客户端推消息。所以你在Postman里的操作节奏从发一次请求看一次返回变成了建立连接、保持连接、在连接上互发消息、最终断开连接。刚开始用Postman测WebSocket的人最容易犯的一个错就是把WebSocket当HTTP来用——以为像Send一个GET请求那样连完就完事了。实际上WebSocket测试的重头戏全在连接建立之后的持续交互上。1.2 测试目标从看响应变成了看连接状态HTTP的测试断言核心是响应状态码和响应体。WebSocket的测试目标呢我个人在实际工作中总结下来主要就这几类握手是否成功也就是连接的建立过程。服务端返回的究竟是101还是4xx/5xx这决定了你后面所有操作有没有意义。消息能否正常收发包括文本消息和二进制消息客户端发的能不能到服务端服务端主动推的能不能被客户端收到。业务逻辑是否闭环比如某些WebSocket服务要求客户端先发一条鉴权消息服务端确认后才开始推送业务数据又比如订阅某个频道之后服务端才会把对应主题的消息推过来。连接的稳定性这是WebSocket测试里最容易被忽略的一点。HTTP请求发完就完了但WebSocket连接可能挂着几分钟甚至几小时这期间如果服务端因为心跳超时把你踢了或者网络层把空闲连接断了都是需要重点验证的问题。所以在Postman里测WebSocket你不但要会点按钮还要学会读连接状态。比如握手成功后界面显示什么、断开之后显示什么、消息列表里每条记录是什么含义这些细节后面我会逐个拆开说。1.3 哪些场景最需要这类测试如果你手里只有纯HTTP接口那这篇你暂时用不上。但下面这些场景WebSocket测试几乎是刚需实时消息推送比如IM系统、客服系统、消息通知中心服务端要主动往客户端推消息。实时协作类功能在线文档、白板协作、多端同步这类场景对消息顺序和连接稳定性要求都很高。行情/监控类大屏股票行情、服务器指标上报、IoT设备状态上送连接一旦断开整条数据链路就断了。游戏/互动类服务状态同步、玩家匹配、回合制交互这类通常对延迟敏感而Postman至少能帮你验证消息收发通不通。我自己一个很典型的经历是后端同事说WebSocket服务的鉴权逻辑写好了让我帮忙验证。我那时候还没用Postman测过WebSocket只好临时写了个Node脚本去连结果脚本里忘记带cookie后端一直返回鉴权失败。来回折腾了大半天后来改用Postman把header和query参数都可视化填好一Connect就成了。这就是工具的杠杆作用——把连接过程的各个要素摊开在你面前出错时一眼就能看到是哪一环不对。2. 连接前的地址拆解与环境准备2.1 先确认Postman版本和功能入口要用WebSocket功能先确认你的Postman是较新的版本。我记得WebSocket支持是2020年前后在Postman 9.0版本里正式开放的到现在已经迭代了好几轮功能已经比较完善。所以只要你不是还装着一个五六年前的老版本基本都自带这个能力。入口在Postman左侧边栏有一个New按钮点开之后可以在Create New里找到WebSocket的入口。还有一种更快的办法在主界面顶部的URL输入框旁边有个协议下拉选择把HTTP切成WebSocket界面就会切换成WebSocket测试面板。如果你用的是Postman桌面客户端建议优先用桌面版而不是网页版桌面版对长连接的支持更稳定网页版我在实测中偶尔会遇到连接被浏览器策略干扰的情况。2.2 WebSocket地址的拆分别只盯着ws://或wss://很多人在这一步就开始犯迷糊了。HTTP地址是http://host:port/pathWebSocket地址则是ws://host:port/path加密连接是wss://host:port/path。看起来就是协议头换了一下但接下来的细节才是关键。一个完整的WebSocket连接地址可以拆成这几段协议头ws://或wss://前者明文后者走TLS加密。线上环境一般强制wss本地联调通常是ws。主机和端口比如localhost:8080、192.168.1.100:9000。注意WebSocket的端口和HTTP端口不一定相同很多人默认以为和HTTP同一个端口结果端口填错连接失败。路径/ws、/socket.io、/api/live这一层用于服务端路由区分。有些服务端会在路径上做子协议区分丢了路径可能直接404或者握手失败。Query参数?tokenxxxroomId123这一层常用来带鉴权信息、房间号、客户端标识等业务参数。拿一个真实例子来说我之前联调过一个实时弹幕服务它的地址长这样ws://api.example.com/live/ws?roomId10086userId9527tokenabcdefg123456乍一看路径是/live/wsquery带了三个业务参数。如果我在Postman里只填ws://api.example.com/live/ws连接虽然能建起来但服务端不知道你要进哪个直播间可能直接拒绝握手或者建连后立刻把你断开。这种能连上但没业务效果的坑就是地址没带全导致的。2.3 Header与子协议在握手前把信息带全WebSocket的握手本质上是HTTP Upgrade请求所以HTTP能带的headerWebSocket握手基本都能带。Postman的WebSocket界面里在Connect之前有一个专门的Headers页签你可以在这里填键值对。我实际用得最多的几个HeaderAuthorization/Cookie很多服务鉴权不走query而是走header或者cookie里存的会话ID。Sec-WebSocket-Protocol这是WebSocket的子协议协商字段。比如客户端想告诉服务端我用的是JSON格式的子协议就在这个header里写json服务端如果支持会在握手响应里选择其中一个回回来。如果服务端要求必须带上子协议而你没带握手可能直接失败。Origin个别服务端会做跨域校验校验不通过就拒绝握手。这种场景下你在Postman里需要手动设置Origin和预期值一致。这里我特别提一下子协议。很多人不知道Sec-WebSocket-Protocol是干嘛的。可以这么理解WebSocket是一个传输管道但管道里跑的数据格式可以用子协议来约定。比如你是用纯文本还是用JSON或者某个自定义协议服务端在握手时通过这个header来协商。Postman里填了这个header相当于在电话接通前先跟对方说好我们待会儿用普通话聊服务端同意的话这个普通话就作为协商结果固定下来。2.4 本地起一个回显服务端没有现成环境也能练如果你手头暂时没有可用的WebSocket服务端但又想把这个流程跑通我建议你在本地起一个极简的WebSocket服务。用Node.js的话装一个ws库下面这几行代码就能跑起来const WebSocket require(ws); const wss new WebSocket.Server({ port: 3000 }); wss.on(connection, (ws) { console.log(client connected); ws.on(message, (message) { console.log(received:, message.toString()); ws.send(echo: message.toString()); }); ws.send(welcome to the websocket server); });启动之后你本地就有了一个跑在ws://localhost:3000的WebSocket服务。它的行为很简单客户端连上来就发一句欢迎语客户端发什么它原样返回什么。这个环境足够你把Postman里Connect、发消息、收推送这一整套动作全部走一遍。等理解了每个按钮的行为再拿去连真实业务服务就不会手忙脚乱了。3. 从Connect到Disconnect的完整测试流程3.1 发起握手Connect按钮背后发生了什么打开Postman的WebSocket标签页把地址填进去之后界面右侧有几个关键区域地址栏下方的Headers配置、中间的Message输入区以及最显眼的Connect按钮。点下Connect的那一瞬间Postman做的事情是把WebSocket的握手请求发出去等待服务端响应。握手成功的话按钮状态会变化界面会提示连接已建立。怎么确认是真正的成功而不是看起来成功两个标志按钮从Connect变为Disconnect连接状态显示为连接中或Connected。服务端返回的握手状态码是101 Switching Protocols。只有这个状态码才代表HTTP协议正式切换成了WebSocket协议。我在实测中见过有人点了Connect之后看到按钮变化就以为成功但实际上服务端返回的是400比如缺了必要参数或者403鉴权不过。所以第一步建议是把注意力放在握手状态码上不要只看界面状态。Postman里有Console面板能看到详细的握手请求和响应后面第4章我会展开讲。3.2 发消息单独发送与消息列表的配合连接建立之后界面下方会出现一个消息输入区你可以输入文本并点击Send。发出去的每条消息都会出现在中间的消息列表里同时带一个向右的箭头指示客户端到服务端的方向。这里有一个使用上的小技巧消息输入区支持多行你可以在里面粘贴一段JSON再发送。比如某业务服务要求客户端发一条{type:auth,token:xxx}的鉴权消息你直接把这串JSON粘贴进去发送。服务端如果返回{type:auth_success}你就能在消息列表里看到它这条记录会带个向左的箭头表示服务端到客户端的方向。消息列表是整个调试过程中最有价值的信息源。每一条记录都带有收发方向、时间戳、消息内容你在浏览器里写代码调试时这些信息全靠自己console.log打而在Postman里是自动记录的。这个差异看上去不大实际排查问题时能省很多时间。3.3 观察服务端推送与消息时间线连接建立、鉴权也成功后你要验证的往往是服务端会不会主动推数据。这个验证过程在Postman里就是挂着连接等消息列表自动出现新记录。什么都不用操作服务端的推送自然就会显示出来。我自己在测一个告警推送服务的时候连接一挂每分钟服务端会推一条监控指标。消息列表里会连续出现多条向左的箭头时间戳逐条推进。这时候要验证的不仅仅是有没有消息还有消息频率对不对内容结构是否符合预期。Postman这个界面里时间戳挨个看下来推送规律一目了然连造数据都省了。如果你需要连续测试多轮交互我建议把消息列表的时间线当成连接生命周期的日志来看什么时候连接的什么时候收的第一条消息什么时候发的鉴权什么时候收到确认什么时候连接断的。这一个列表基本就是整个会话过程的完整回放。3.4 断开、重连与连接状态判断测完一轮别直接关Postman了事。WebSocket测试里断开和重连同样是必测场景。Postman的Disconnect按钮干的事情就是主动关闭连接。我实测中比较常用的几个状态连接建立后你主动点Disconnect本地会发起关闭握手服务端如果支持会回一个关闭帧。断线之后如果用同一个页面重新ConnectPostman会重新走握手流程等于原连接已作废、新连接重新建立。服务端主动断开连接时Postman的消息列表里会看到一条断开记录并且连接状态变为已断开或未连接。在真实业务里连接释放的原因非常多客户端长时间没发数据被服务端踢了、断网了、服务端重启了。Postman能帮你验证的是断开的原因能不能复现、断开之后的界面表现是否符合预期。至于自动重连逻辑Postman本身不提供自动重连机制需要你手动再点Connect。但这不影响你测试——你在Postman里手动重连恰恰模拟的就是客户端SDK里断线重连的那段逻辑。4. 实测中容易被忽略的握手细节与调试技巧4.1 101不只是个数字握手的完整含义我们先把这个知识点讲透。WebSocket握手的过程在网络上就是一次HTTP GET请求但多了两个关键HeaderConnection: Upgrade和Upgrade: websocket。服务端如果同意升级协议就返回101 Switching Protocols。返回之后TCP连接还在但双方交换的数据不再是HTTP报文而是WebSocket帧了。Postman界面里握手细节默认不是那么显眼但你可以通过View菜单里的Console打开控制台日志。Console里会显示一条WebSocket Handshake的记录点开能看到完整的请求Header和响应Header。有一次我在联调时服务端返回了404Console里一查发现是路径里的/ws写成了/wss——协议头没错但路径拼错了。这要是放在浏览器里调你看不到这些细节还不知道排查到什么时候。所以我的建议是以后凡是遇到连不上的问题第一步永远是打开Console看握手请求和响应别凭感觉瞎猜。101这个状态码是你判断握手成功的唯一硬标准。4.2 Query参数和Header为什么业务鉴权最爱放这里很多初学WebSocket的同事会问鉴权信息放在Query里安全吗从业务实践来看WebSocket的握手会被浏览器限制得比较多——浏览器里的WebSocket API不能自定义Header所以很多服务为了兼容浏览器场景只能把token塞在Query里。这就是为什么你看到很多WebSocket地址长得特别长后面挂了一堆参数。在Postman里Query参数的处理方式和HTTP请求几乎一样你在地址栏里直接拼就行或者把头放在Headers区域。我自己的习惯是会话级参数token、sessionId放Query协议级参数subprotocol、origin放Header这样出了问题也好定位是哪一类参数导致的握手失败。这里再提醒一个容易踩的细节Postman地址栏里如果已经带了Query参数你在Headers页签里就不用再去设置Content-Type了——WebSocket握手本身不涉及请求体也没有Content-Type这个概念。有些人习惯性地把HTTP的一套做法搬过来填了一堆无意义的Header反而容易引发服务端解析异常。4.3 二进制帧、JSON串与格式化显示WebSocket消息不只包含文本帧还有二进制帧。Postman的消息输入区默认是文本输入但它也支持发送二进制数据。我实测下来发送二进制的场景多见于自定义协议的数据上报、图片/音频分片传输等。你用Postman发二进制的时候要注意服务端那边怎么解析——如果服务端是按自定义协议拆包的Postman发出去的原生字节流必须严格遵守长度、魔数、版本号等字段约定否则服务端会直接丢弃或者报错。收到二进制帧时Postman的消息列表里显示的是Base64编码后的内容。这个显示方式虽然不直观但至少能让你确认消息确实收到了。如果你需要看具体的字节布局可以把它拷出来在本地用脚本做一步解码。再有一个高频场景是JSON消息。我强烈建议你在发送之前先在外部工具里把JSON压缩成单行串再粘贴到Postman里否则多行JSON肉眼看起来没问题但服务端解析的时候可能因为回车符或者多余空格出幺蛾子。我遇到过不止一次服务端一直报JSON解析失败结果发现是Postman贴入的JSON里混进了不可见字符。把文本用格式化工具转一遍再贴这种问题基本能避免。4.4 用Console日志还原整个链路前面提了好几次Console这里专门展开说一下。Postman的Console控制台不仅仅记录握手请求它还会把所有WebSocket的连接事件、收发消息记录都打印出来。在WebSocket测试里Console的价值比HTTP测试更大因为HTTP测试的Response是显眼的而WebSocket的很多事件连接中断、ping/pong、异常关闭分布在时间线里不打开Console根本看不全。我在实际排查一个连接几秒后就断开的问题时就是靠Console日志看到服务端在断开前发了一个{code:4001,msg:heartbeat timeout}的消息。虽然这个消息在消息列表里也能看到但Console里能看到它发生的时间和前后事件顺序这个时间线信息对定位问题非常关键。建议你养成一个习惯每次测试完花30秒看一下Console日志把握手时间、第一条消息时间、断开时间这几个节点串一下。如果你发现断开时间点和某个事件高度吻合比如恰好是你发完某条消息之后那就是业务逻辑导致的主动断连如果时间完全随机那大概率是网络或空闲超时的问题。这个分析思路能省掉你大量瞎猜的时间。5. 高频故障与排查过程记录5.1 一直Connecting但不报错先把URL和网络翻个底朝天最常见的第一坑点了Connect按钮一直处于转圈状态界面不报错也不显示连接失败。我一开始遇到这种问题第一反应是怀疑服务端有问题后来排查多了发现Postman这边的原因更多。排查顺序按下面这个来第一步确认URL是否带全了路径。很多服务端的WebSocket路由不是根路径你填ws://host:port没带/ws或/socket.io之类的路径服务端根本没有对应的handler连接就一直挂起。第二步确认端口是否准确。WebSocket端口和HTTP端口经常不一样比如HTTP在8080WebSocket在8081。只把协议头从http改成ws是远远不够的端口也得跟着改。第三步检查代理设置。公司网络如果默认开了系统代理Postman的WebSocket连接很可能被代理拦了。遇到Connecting卡住去Postman设置里把代理关掉再试多半能通。第四步检查服务端日志。这一步需要前后端配合让后端同事看看有没有收到握手请求。如果服务端完全没日志那问题大概率出在网络或者地址层如果服务端有握手请求但挂起不响应那就是服务端逻辑的问题。我遇到过最离谱的一次是地址里把ws://localhost:3000写成了ws://localhost:3000/ws但服务端监听的是根路径多一个/ws路径后服务端一直没有响应。看起来就是一个斜杠的差别但排查花费的时间远超预期。所以地址这种东西一旦不对务必逐字符检查。5.2 连上了但收不到任何消息子协议与事件名的隐形门槛如果你已经能看到101握手成功但消息列表里怎么等都没有数据这时候要做的不是继续干等而是重新审视业务逻辑。第一种可能是子协议没对齐。我前面提过Sec-WebSocket-Protocol这个header如果服务端要求客户端声明子协议而你没带或者带错了握手可能仍然成功但服务端不把你当成一个合法的业务客户端。对应到业务上推送自然不会来。解决办法是去问后端要一份准确的握手Header照着填。第二种可能是鉴权消息没发或者发得不对。很多WebSocket服务采用的是先连接、后鉴权的模式握手只是建立通道真正的业务准入是靠连接后客户端发的一条业务消息完成的。比如你连上后要先发{type:auth,token:xxx}服务端回一条auth_success之后才开始推数据。如果鉴权消息没发或者token不对服务端可能保持静默不推送任何业务消息。第三种可能是事件名/订阅频道不对。有些服务端的推送是按频道订阅的你得先发一条subscribe消息订阅某个事件主题服务端才会把对应主题的消息推来。跟鉴权一样这些操作都发生在连接建立之后Postman的消息列表里完全能看到你发的每一句话逐条对一下就知道是哪一步断了。我自己在排查这类问题时有个习惯连接建立之后第一件事先看服务端有没有主动发一条欢迎消息或握手确认消息。如果连这个都没有说明服务端根本没把连接当业务连接处理问题大概率在握手或鉴权层如果有欢迎消息但没有业务推送那问题多半在订阅或事件名上。5.3 连接几秒就断开心跳机制与空闲超时的经典对决这是WebSocket联调中特别经典的一个问题连接明明建好了消息也通了但每次过个几十秒Postman这边就提示连接关闭。很多人的第一反应是网络不稳服务端有bug其实大概率是心跳机制没对上。WebSocket本身没有强制要求心跳但服务端为了清理死连接通常会设置一个空闲超时时间。如果客户端在超时时间内没有发送任何数据包括心跳包服务端就认为这个客户端挂了主动断开连接。这就解释了为什么你在Postman里挂机不动连接反而更容易断。对应解法有两种一种是手动模拟心跳。服务端协议里通常会约定心跳消息格式比如{type:ping}或{op:heartbeat}。你在Postman里每隔一段时间手动发一条心跳消息看看连接是不是就不再被断开了。另一种是验证心跳机制本身。有些服务端的心跳是双向的客户端发ping服务端回pong。你在Postman里发完心跳消息观察消息列表里有没有对应的pong响应。如果有说明心跳链路正常如果没有那就是服务端没正确处理你的心跳包。我实测过一个物联网设备接入服务服务端的空闲超时是60秒客户端每30秒要发一次心跳。我在Postman里挂机刷消息到第60秒就被断开后来改成定时手动发心跳连接就一直挂着不断。这个测试放在任何客户端SDK里都一样心跳周期和空闲超时之间的关系是你做长连接服务必须验证的一项。5.4 自签名证书与代理环境wss连接的两个隐形杀手本地联调经常遇到wss://协议但开发环境用的是自签名TLS证书。这种时候Postman会报证书校验错误导致握手失败。解决办法不复杂在Postman的Settings里把SSL证书校验关掉或者把自签名证书导入到系统信任链里。我更推荐后者因为直接关掉校验会让安全习惯变差而且导入证书之后你还能顺便验证一下证书链是否完整。还有一个坑是代理。公司网络有时候会全局走代理而WebSocket对代理的支持是有限度的。HTTP代理处理WebSocket的升级请求时如果是老旧的代理服务可能无法正确转发Upgrade头导致连接失败。我在Postman里遇到过类似问题表现是毫秒级就连接失败比超时那种还干脆。去Settings里把代理改成直连问题立刻消失。这里再多说一句虽然Postman是个本地工具但它对系统网络配置的依赖非常强。很多时候问题不在你的WebSocket接口本身而是本地网络环境和服务端不在同一个平面。排查这种问题时多准备一条直觉外的路径——先检查本地配置再怀疑服务端效率往往更高。6. 把WebSocket测试沉淀成日常能力6.1 用环境变量管理多套环境地址测WebSocket和测HTTP一样dev、test、prod多套环境的地址不一样。如果每次测试都在地址栏里手工改host和端口既慢又容易出错。Postman的Environment功能在WebSocket测试里同样有效。我的做法是建三套环境dev、test、prod每套环境里定义以下几个变量wsBaseUrl比如ws://dev-api.example.comwsPath比如/live/wsapiToken不同环境对应的token然后在WebSocket的地址栏里直接写成{{wsBaseUrl}}{{wsPath}}?token{{apiToken}}。这样切换环境时只需改一下右上角的环境选择器地址、Token、鉴权参数全部跟着换。这个收益在联调阶段特别明显你会省下大量复制地址、替换参数、重新粘贴的时间。这里提醒一下地址栏使用了环境变量之后填写的URL不会显示变量值本身而是显示变量名。第一次用的人会有点慌其实这是正常的。你可以把鼠标悬停在变量名上Postman会弹出当前解析出的实际值确认无误再Connect。6.2 用脚本自动生成Token并注入握手HeaderWebSocket测试里最麻烦的重复劳动莫过于每次手动填Token。如果Token还有过期时间你可能每隔一小时就要去重新生成一次手动粘到Headers里实验中途忘了刷新又会因为过期被拒。Postman的Pre-request Script在HTTP请求里很好用但WebSocket标签页的握手请求同样支持脚本。你可以写一段脚本自动调一个HTTP接口获取Token然后将Token写入环境变量这样握手时Header里的Authorization字段会自动带上最新的值。下面是一个简单的脚本示例const loginRequest { url: https://api.example.com/login, method: POST, header: { Content-Type: application/json, }, body: { mode: raw, raw: JSON.stringify({ username: test, password: 123456 }), }, }; pm.sendRequest(loginRequest, (err, res) { if (err) { console.log(login failed:, err); return; } const token res.json().data.token; pm.environment.set(wsToken, token); });这段脚本的本质是在握手发起之前先去登录接口换一个最新的Token再把这个Token存到环境变量里。Postman WebSocket的Headers区域里你只需要填Authorization: Bearer {{wsToken}}Postman发握手请求的时候会自动替换成实际的Token值。这个方案我现在几乎每个WebSocket接口都在用。好处不言而喻手工复制Token的环节彻底没了而且每次测试用的是刚生成的有效Token不会再出现我以为Token没问题其实早就过期了这种低级错误。6.3 用Collection保存测试场景沉淀给团队复用单个WebSocket请求如果只是自己临时测测配置好了用完就走其实有点可惜。Postman的Collection功能可以把WebSocket测试场景完整保存下来包括连接地址、Headers、Query参数、消息记录甚至可以写成文档注释分享给团队里的其他人用。我在团队里经常干的一件事是接一个新WebSocket服务我会先花十分钟在Postman里跑通连接、鉴权、订阅、收消息这一整套流程然后把整个场景存成一个Collection取名叫XX服务-WebSocket联调场景里面写清楚每一步该填什么、预期收到什么。后面其他同事再接手同一个服务直接在Collection里点Connect就能用不用从零开始摸索。这一步也是把个人调试能力变成团队测试资产的关键一步。你别小看一个Collection的价值它本质上是一个可复现的测试用例集合——连接参数、握手Header、心跳消息、预期响应全在里面。对于测试同学来说这甚至可以作为WebSocket接口的冒烟测试脚本基础。最后分享一个我个人很受用的习惯每次接到WebSocket接口任务不是急着联调而是先在Postman里把连接-鉴权-业务消息-心跳-断开五个步骤全部跑一遍。这个过程看似多余但它能把连接链路里所有隐性依赖子协议、路径、Token、心跳参数一次性摸清。之后不管是用Postman继续手动测试还是写自动化脚本心里都有一张全链路的地图。这个习惯帮我省了无数次后知后觉的返工也让我对Postman测WebSocket这件事真正从会点按钮进化到了会排查问题的阶段。