如题:主播最近在本地开发中遇到了一个bug,大概是我的接口中需要请求外部同事的接口,然后每次请求都会报错,每次每次都错!,然后返回的error是《时间戳已过期或签名未通过》,顾名思义,应该就是包装请求头的时间戳过期了:
但是正常来说也得超过五分钟才会过去吧,我这一整个接口都用不了1秒,怎么会!怎么会!(陷入沉思
然后尝试让同事帮忙在他们本地执行,他都可以,all ! without me. no!
开始怀疑jdk、怀疑电脑(有理由换好点的Mac哈哈,开玩笑)
然后更换jdk后也一样有问题,然后开始怀疑电脑本地时间有问题,但是每次本地生成的时间戳拿去转换时间,都和当前差不多(就早了10几秒嘛,因为操作去网页翻译要点时间,就感觉正常,埋雷)
再加上难以调试对方服务,只能通过他的返回结果来参考,所以就思维定势一看关注着《时间戳已过期、时间戳已过期》
然后主播开始怀疑是不是获取时间戳的函数有问题(玄学)、然后我又换了Date、Instant...各种生成的方式,都不行
然后,我就打断点调试看情况,看这个值对不对,都感觉挺正常的,哦!然后有一次,主播打完断点后,就去干人生大事(上厕所),回来打算继续解决,然后把断点一放,通过了!!!哦哦哦!!
fine,陷入沉思,然后想是不是断点打久一点,再放行就可以通过,OK,开始验证,还真是!然后一度感觉项目在抽风(因为返回都说时间过期了,你不想着加速,反而等待拖后了),但是事实胜于雄辩!结果就是这样,
然后我开始反思,为什么一定就是我代码的问题,不是他的问题(准确来说是他返回结果的问题)然后我开始想,时间戳过期至少五分钟吧,我肯定不会触发,但是他还是返回,
就是一点!不是过期,反而是超过他了!我本地的时间是他未来的时间,因为就多了几秒的纯在(崩!卖的雷炸了,多几秒),所以难以察觉,也验证了,打断点几秒后就可以通过。
然后我就去看本地时间的配置(如何):
没和服务端同步!wdf,验证猜想,打开
重试,不用打断点,丝滑请求通过!
那文章到这基本接近尾声了,小小总结一下吧!
1.耳听为虚,眼见为实。给我们返回的报错提示也不一定是对的,要自己操作验证
2.头脑风暴,想想多种方法(包括相反的可能),或许就是呢,这次就是这样