几天的故障,结果是个低级错误。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
windbadboy
V2EX    程序员

几天的故障,结果是个低级错误。

  •  
  •   windbadboy 2023-11-30 20:42:14 +08:00 7119 次点击
    这是一个创建于 681 天前的主题,其中的信息可能已经有所发展或是发生改变。

    单位的 HIS 系统需要增加一个上报接口,his 商部署后一直调试有问题,对端平台返回报错“非法参数"。 联系平台技术人员确认 token 、appid,secret 都没有问题。his 商找不到问题,就说平台那边的问题,搞成无限循环了。 无奈研究接口文档,用蹩脚的编程水平通过 python 自己调用接口,发现平台是可以成功返回正常信息的,确认平台正常。让 his 找自己的问题,结果最后发现是 his 商将 secret 的一个 0 写成了 o ,问题解决。

    一个低级错误,卡了几天,我觉得一方面是自己水平不够高,没仔细看接口文档,第二方面平台返回的信息比较少,另一方面是 his 商自己测试不严谨造成的,都有问题。

    49 条回复    2023-12-02 23:30:23 +08:00
    fzls
        1
    fzls  
       2023-11-30 20:46:28 +08:00
    遇到这种情况确实很糟心,几个长得很像的字符,乍一看真认不出来
    lloovve
        2
    lloovve  
       2023-11-30 20:48:07 +08:00 via iPhone
    用特殊字体,一看就能区分出 0 个 o
    yzy8788
        3
    yzy8788  
       2023-11-30 20:54:57 +08:00
    secret 应该很长吧? his 商手动抄上去的?
    Itoktsnhc
        4
    Itoktsnhc  
       2023-11-30 20:55:31 +08:00   1
    或许是从截图里面 OCR 上去的
    viWww0vvxmolvY5p
        5
    viWww0vvxmolvY5p  
       2023-11-30 20:59:26 +08:00
    对这种低级错误早没脾气了。
    windbadboy
        6
    windbadboy  
    OP
       2023-11-30 21:29:01 +08:00
    @yzy8788 不长,怀疑是手动。没太深究了,错误太低级。
    windbadboy
        7
    windbadboy  
    OP
       2023-11-30 21:30:05 +08:00   2
    @mway 何必为了别人的错误发脾气,一笑带过。多想想自己也有没做好的地方。
    Huelse
        8
    Huelse  
       2023-11-30 21:35:22 +08:00
    这时候专业的编程字体就能起到一定的提示作用,数字 0 中间有斜杠或点,o 就是 o
    windbadboy
        9
    windbadboy  
    OP
       2023-11-30 21:53:40 +08:00
    @Huelse @lloovve 都是好建议,有没有推荐的字体?
    eaststarpen
        10
    eaststarpen  
       2023-11-30 22:29:34 +08:00
    @windbadboy

    > 有没有推荐的字体?

    NerdFont 都是

    不得不吐嘈一下 Chrome 地址栏中 I(大写的 i) l(小写的 L) 分不清

    每次我在手机上获得百度网盘的分享链接, 里面往往有 l 和 I,在地址栏直接输入导致我 404
    sloknyyz
        11
    sloknyyz  
       2023-11-30 22:39:34 +08:00
    0oil1I , 有些字体显示的这几个是真容易看错
    flynaj
        12
    flynaj  
       2023-11-30 23:17:41 +08:00 via Android
    0Oil1I 小米字体还可以,这个完全的靠字体。
    @sloknyyz
    PrinceofInj
        13
    PrinceofInj  
       2023-11-30 23:21:48 +08:00
    八成是从微信的拍屏中拷过来的。
    leoleoasd
        14
    leoleoasd  
       2023-11-30 23:34:11 +08:00
    另一种改进思路是生成随机 secret 的时候就不用 oO0iIl1 这些字符
    qping
        15
    qping  
       2023-12-01 06:34:05 +08:00 via Android
    核对字符串不能靠看,只能搜
    sampeng
        16
    sampeng  
       2023-12-01 08:22:04 +08:00 via iPhone   1
    根本是对端平台智障的错误提示…这不应该是 401 之类的未认证错误么
    weeei
        17
    weeei  
       2023-12-01 09:00:11 +08:00
    secret 错了他们自己咋调试通的?
    heliang
        18
    heliang  
       2023-12-01 09:19:15 +08:00
    想起来前几天和你这个何其相似 后台配置页面 secret 后面多了一个空格。白瞎好几天
    jy02201949
        19
    jy02201949  
       2023-12-01 09:28:36 +08:00
    《论编程字体选择的重要性》
    hesetiema
        20
    hesetiema  
       2023-12-01 09:28:47 +08:00
    字体推荐:Oxygen Mono
    ProphetN
        21
    ProphetN  
       2023-12-01 09:35:58 +08:00
    说明文档写的不够好。
    sjtulyj
      &nsp; 22
    sjtulyj  
       2023-12-01 09:37:04 +08:00
    secret 错误, 不应该很容易从日志里看出来吗
    fatyoung
        23
    fatyoung  
       2023-12-01 09:47:15 +08:00
    secret 错误返回非法参数? 那从日志看是哪一行报非法参数应该也能找出来
    justfindu
        24
    justfindu  
       2023-12-01 09:48:18 +08:00
    手抄 secret 啊 至少 32 位呢
    ho121
        25
    ho121  
       2023-12-01 09:49:42 +08:00
    有可能是 PDF 复制过去的
    cndenis
        26
    cndenis  
       2023-12-01 09:52:50 +08:00
    HIS 是医院的系统, 多半是跟公网隔离的, 所以手抄 secret 也不奇怪, 抄错也不奇怪. 受限制的环境下工作就是比较麻烦
    k9982874
        27
    k9982874  
       2023-12-01 09:54:51 +08:00
    对端平台返回报错“非法参数"
    对端平台也是二把刀,不应该返回 forbidden 或者 unauthorized ,外加一个自定义错误码吗?
    gpt5
        28
    gpt5  
       2023-12-01 09:57:52 +08:00
    我在工作中也遇到过类似的,几个人找了好几个小时,发现是一个变量 o 被写成了 0 。
    HK560
        29
    HK560  
       2023-12-01 10:00:43 +08:00
    一直用 console 字体,感觉还行吧...
    sss15
        30
    sss15  
       2023-12-01 10:00:49 +08:00
    其实是平台报错有歧义,非法参数到底是 token 、secret 验证失败,还是请求 api 的参数有问题? 我认为做接口一定要报错报清楚了,什么参数有问题就说哪个参数有问题,并且给出解决方案是最好的报错。 譬如这边如果报错提示“验签失败,请检查 token 、appid 、secret”。 如果是上报的某个参数真的有问题,举个例子如果是 age 参数,后台校验 age 必须为 int ,且必须 0-100 之间,既然校验这里报错了,就应该提示“age 参数非法,请输入 0-100 之间的数字”。

    怕就怕接口文档不写清楚,报错提示也不模模糊糊,这种接口最难对了
    InDom
        31
    InDom  
       2023-12-01 10:02:59 +08:00   1
    想起了那个用户昵称就叫 “Null” 的了。
    xFrye
        32
    xFrye  
       2023-12-01 10:03:24 +08:00
    οver , over

    这是我之前在 v2 看到的一个帖子,上面这两个 over 说实话我用肉眼真的分不清
    HK560
        33
    HK560  
       2023-12-01 10:04:03 +08:00
    @HK560 补全错了,是 Consolas
    cquan
        34
    cquan  
       2023-12-01 10:04:59 +08:00
    bug 的真正含义
    lll5758
        35
    lll5758  
       2023-12-01 10:13:05 +08:00
    @xFrye #32 我的天.....这是什么啊
    lonelycityzhou
        36
    lonelycityzhou  
       2023-12-01 10:18:59 +08:00
    所以说有的字体很傻逼
    oamzn
        37
    oamzn  
       2023-12-01 11:35:26 +08:00
    Operator Mono
    7inFen
        38
    7inFen  
       2023-12-01 11:56:52 +08:00
    o 和 l 应该被开除字母集
    fulinlin9527
        39
    fulinlin9527  
       2023-12-01 11:59:15 +08:00 via Android
    微信中的大写 i 和小写 L
    lilei2023
        40
    lilei2023  
       2023-12-01 13:51:22 +08:00
    @xFrye 这两个神奇的 o
    wtof
        41
    wtof  
       2023-12-01 15:35:00 +08:00
    Source Code Pro 还不错,一直在用
    0Oil1I 这几个区别还比较明显
    https://github.com/adobe-fonts/source-code-pro
    CivAx
        42
    CivAx  
       2023-12-01 15:54:43 +08:00
    @HK560 Consolas 对 O0o Ww Uu Ss Kk Zz Xx Cc Vv 的识别并不是很好,至少没有对比的情况下,Oo 和 Ww 是真的一眼看不出来
    Greendays
        43
    Greendays  
       2023-12-01 16:00:38 +08:00
    Jetbrain 的字体也挺好的,这些长得差不多的字母都有区别。
    bthulu
        44
    bthulu  
       2023-12-01 16:30:12 +08:00
    这还是平台问题, 没对密码做模糊验证处理. 比如 o, 0, O, 这种都要看作同一个字符视为验证通过.
    matepi
        45
    matepi  
       2023-12-01 16:46:32 +08:00
    来回顾一下快 4 年的这个贴吧

    t/638609

    针对 Java
    static int i = Integer.parseInt(SomeUtil.readNumberFromPropeties);
    然后在 Propeties 里面写了 2O 不是 20
    Integer.parseInt("2O")
    会抛出
    java.lang.ExceptionInitializerError ..
    Caused by: java.lang.NumberFormatException ...

    然后这个 java.lang.ExceptionInitializerError 不能被 catch(Exception e) 捕获,没有记录日志
    应该 catch(Thrwoable e) 捕获,才能记录下日志

    然后你的同学,坚持了所谓的异常处理"军规",Never catch Throwable class……
    导致没有任何出错日志,此问题异常难查

    XD
    HK560
        46
    HK560  
       2023-12-01 20:32:32 +08:00
    @CivAx 常年都是在编辑器里看的,大小写这个还好认一点,只能要能区分出 0oli 就行(笑哭
    kanecolin
        47
    kanecolin  
       2023-12-02 14:21:11 +08:00
    所以成熟接口验证算法里有防呆机制,会通过算法中的特殊设置去掉这类的识别干扰项
    iorilu
        48
    iorilu  
       2023-12-02 18:29:12 +08:00
    这些密钥啥的应该都是复制的, 或者直接写在配置文件里, 需要时候读取, 不应该放代码里一起吧
    rekulas
        49
    rekulas  
       2023-12-02 23:30:23 +08:00
    确实经验还不够,这种 bug 在正常水平开发者手里应该活不过 2 小时,像这类平台类参数错误第一反应不是应该对比同参数签名的结果值是否一致么,逐一排除干扰因素一下就找到问题了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2742 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 07:34 PVG 15:34 LAX 00:34 JFK 03:34
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86