一个接口返回了成功的状态码,页面却什么都没显示。这种落差,做过后端联调的人大概都遇到过。

在开发者社区里,围绕内容管理系统与接口设计的讨论一直没停过。有人聊CMS的演进,有人聊怎么让Slack把你的用户状态显示成在线,也有人聊用Python在Appengine上做不带井号的AngularJS路由。这些话题看起来分散,指向的其实是同一件事:接口通了,不等于体验通了。

打开网易新闻 查看精彩图片

接口返回和页面呈现是两回事

接口的职责是告诉你请求被收到了、被处理了。它给出的绿色状态,只代表服务端这一侧没有报错。页面能不能渲染出内容,取决于另一条链路:数据有没有被正确解析、前端有没有拿到预期的字段、渲染时机对不对。

把这两件事混为一谈,就会出现那种尴尬场面——监控面板一片绿,用户那边一片白。

围绕单页应用怎么接上接口,社区里有过专门的讨论,标题直接写着“给单页应用一个接口,最快的方式”。这个提法本身就说明,接口和页面之间的连接不是自动完成的,它需要被专门设计。

前端侧的那些坑

前端这一侧,能出问题的地方不少。路由是一个,React里操作DOM元素是一个,测试又是一个。

有人专门写过在Appengine上用Python跑AngularJS路由、去掉井号的做法。井号在URL里不好看,去掉它却要服务端配合,配置稍有偏差,刷新页面就是404。这类问题不会让接口变红,只会让页面变空。

React里直接操作DOM元素也是常被拿出来讲的话题。框架有自己的渲染节奏,手动插手DOM,时机不对就会出现内容和状态对不上。接口数据明明到了,界面却没跟上。

测试环节同样如此。用页面对象模型配合NightwatchJS写UI测试,被拆成了上下两篇来讲,说明这套东西的细节多到一篇装不下。UI测试要覆盖的,恰恰是接口返回之后、用户看到之前的那一段。

被忽略的还有沟通

还有一类问题跟代码无关。有人写过“站在同一页上:作为软件开发者如何改进沟通技巧”。接口文档写得含糊,字段含义靠猜,前端按自己的理解渲染,后端按自己的理解返回,两边都觉得自己没错。

这种情况下,接口是绿的,页面是错的,或者干脆是空的。排查起来,双方第一反应都是对方的问题。

从CMS的演进,到单页应用接接口,再到UI测试和团队沟通,这些话题被放在一起并不偶然。它们共同描述了一条完整的链路:数据从系统里出来,经过接口,穿过前端,最后落到用户眼前。任何一个环节掉链子,绿色都只是个假象。

接口的绿色状态码,回答的是“请求成功了吗”。它回答不了“用户看到了吗”。这两个问题之间,隔着路由配置、渲染时机、测试覆盖和人与人之间的对齐。把绿色当成终点,页面就会用空白来提醒你,它还没到。