多年经验的程序员,却差点出生产事故,到底发生了啥?

前言

现如今的状况,我更垂青开发进程的谨慎性,随着咱们在学习中,工作中,学习到的常识点越来越多,导致咱们在开发进程中许多都记不清楚,或是有些常识点你其实是知道的,可是在实践开发时,你便是把相关的常识点给忘了,然后导致开发时思想逻辑不行谨慎,初看或许测验都没有测验出问题,但实践上由于你漏掉了一层逻辑,终究导致线上出了出产事故。

需求背景

在项目中接入其他团队的一个抖音的谈天页面,约好方法为 iframe 接入,需要传递的参数为:

参数称号 类型 阐明
dataId String 仅有Id(sm4加密)
role String 人物 0 = 组员,1 = 组长
signature String 签名,生成方法,以 keyValueKeyValue 形式拼接参数,最终拼接密钥,再以md5进行加密传输

咱们来解读一下这个参数:

  • dataId: sm4 加密的仅有Id
  • role: 人物,这个简略
  • signature: 依照阐明能够确定他的数据要求为:
var dyHost = 'dy.xxxx.com.cn';
var key = "u3U0p9niWo0n1bL6"; // 密钥
var dataId = "3bcd76954353f3e05304251ddf5a3ee7"; // 加密后的仅有Id
var role = "1"; // 人物
var signature = `dataId${dataId}role${role}${key}`; //抱负中的签名

所以我当时面对的工作便是要在 iframe 中添加地址与参数,地址啥都比较简略,参数看似仍是比较简略所以很天然的快速完成任务,把地址拼接好放进src属性,齐活。

// 此处引证 md5 的东西 md5.min.js 这儿就不实践引证了
var signature = md5(signature);
var url = `https://${dyHost}/yunChat.html?dataId=${dataId}&role=${role}&signature=${signature}`;
$("#dy_iframe")[0].contentWindow.location.href = url;

至此感觉现已万事具备了,能够提代码了。

差一点就出了出产事故

就到此时我一点都没有意识到问题的存在,直到上了测验环境,对接的团队给我提了一个问题,说拿不到参数,我懵逼了,反复看了他们供给的对接文档,是这么拼接的参数啊,没啥毛病啊,到此时我都还没有意识到问题出在哪里?我只能在测验环境进行调试,调试中才发现,我拿到的 dataId 也便是后端用 sm4 加密后的 dataId 中出现了保存字符(;/?:@&=+$,),导致对接的团队拿不到参数,茅塞顿开,这我才想起需要对 url 编码,但凡是测验没有用到 sm4 编码后没有特别字符的 dataId,那么出产事故那必定就出了啊。意识到了问题的存在,那接下来便是怎么处理这个问题。要处理保存字符的转译,这儿选择用 encodeURIComponent 方法,用来编码或解码的4种URI我这儿就不去具体解释,搞忘的或许感兴趣就自己去查一下。

// 此处引证 md5 的东西 md5.min.js 这儿就不实践引证了
var signature = md5(signature);
var url = `https://${dyHost}/yunChat.html?dataId=${encodeURIComponent(dataId)}&role=${role}&signature=${signature}`;
$("#dy_iframe")[0].contentWindow.location.href = url;

终究把问题处理了,咱们先来复盘一下,为啥会出问题:

  1. 拿到需求与对接文档,关于拼接地址的常识准备不行充分,忽略了编码的问题;
  2. 对 sm4 加密的常识不了解,也没有去了解,只看到对接示例供给的dataId没有保存字符,就自认为没有保存字符;
  3. 关于编码这个常识点知道,可是开发的时分,不知道,归根结底一句话,常识点由于时刻,或许发散导致的断层。

总结

这篇文章对常识的介绍比较少,主要是在介绍开发进程中的一些感悟。咱们常常忽略,或许遗漏一些小细节,这些小细节不容易发现,可是它又决议着一些特别情况的处理。咱们都知道,常识是死的,用得好才是活的,用的不好,便是负担。关于具有有些经历的小伙伴,可能看到一个需求,凭着多年的开发经历就大概有了规划思路,可是俗话说水淹会水将,可能现在许多时分,大多出问题的当地都是”凭着多年的开发经历”。所以,当咱们拿到需求后,仍是要做比较谨慎的规划,尽管咱们经历还算丰富,那么就使用规划的时分,把相关的常识做一个温故,处理常识点的断层,这样一举两得的事我觉得是值得的,退一万步讲,即使要跳槽,在准备面试书面考试时,都要少花好多时刻。