欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

请求头不支持中文,导致连接失败

程序员文章站 2022-07-14 18:46:43
...

现在市面上有很多稀奇古怪的设备,在咱们封装请求头信息的时候,会把设备的一些信息传到回台,便于统计设备;这就需要android 获取手机,平板的一些信息了,比如 设备的名字、型号、版本号等等
看下面的一张图

请求头不支持中文,导致连接失败

这是在登录的的接口就报错了,当时很奇怪,为什么这么长时间都没有问题,只有这几款设备报错,所以当时就直接跟客户要了这个设备,快递过来找找原因

看报错 说mobile-name 的值是 ‘摆渡者’ 当时还有点懵逼 什么摆渡者,完全不知道什么玩意, 然后一看字段,差点蠢哭,原来这个设备的名字叫 摆渡者 麻蛋的, 直接找到请求头的位置, 打印一下 果然 就是上面的这张图了,既然知道原因了 就解决吧

不支持中文就不传中文,直接转成unicode就完事了

请求头不支持中文,导致连接失败

/**
     * 判断一个字符是否是中文
     * @param c
     */
    public static boolean isChinese(char c) {
        return c >= 0x4E00 && c <= 0x9FA5;// 根据字节码判断
    }

/**
     * 判断一个字符串是否含有中文
     * @param str
     **/
    public static boolean isChinese(String str) {
        if (str == null) return false;
        for (char c : str.toCharArray()) {
            if (isChinese(c)) return true;// 有一个中文字符就返回
        }
        return false;
    }

    /**
     * 中文转unicode
     *
     * @param string
     * @return
     */
    public static String stringToUnicode(String string) {
        StringBuilder unicode = new StringBuilder();
        for (int i = 0; i < string.length(); i++) {
            // 取出每一个字符
            char c = string.charAt(i);
            // 转换为unicode
            //"\\u只是代号,请根据具体所需添加相应的符号"
            unicode.append("\\u").append(Integer.toHexString(c));
        }
        return unicode.toString();
    }

 

        // 判断里面是否包括中文
        if (StringUtil.isChinese(SystemUtils.getMobileName())){
            // 如果包括就转成unicode
            String unicode = StringUtil.stringToUnicode(SystemUtils.getMobileName());
            requestBuilder.addHeader("mobile-name", unicode);
        } else {
            requestBuilder.addHeader("mobile-name", SystemUtils.getMobileName());
        }
        // 判断里面是否包括中文
        if (StringUtil.isChinese(SystemUtils.getMobileModle())){
            // 如果包括就转成unicode
            String unicode = StringUtil.stringToUnicode(SystemUtils.getMobileModle());
            requestBuilder.addHeader("mobile-type", unicode);
        } else {
            requestBuilder.addHeader("mobile-type", SystemUtils.getMobileModle());
        }

这里我还是判断一下, 如果包括中文就转码,不包括还是正常传,大多数设备是没有问题的,很少有中文的, 但是也不得不防, 所以头信息还是尽量不要传中文的值,因为市面上的设备是不可控的,我就是个因为考虑不到, 而且也没有遇到这样的设备 才会出现这种问题。

吐个槽,android设备手机就够苦逼的了, android手机机型实在太多了,而且厂商也不一样,确实适配有难度,但是我还要设备平板,特么的 我就有点心态崩了,以前还好,两个独立的项目,现在重构,重新开发,变成一个项目了, 当时头上一片卧槽飞过,这还不是最痛苦的, 还有更苦逼的, 妈的了, 手机我忍了, 平板 pad 我忍了, 现在竟然还要让我设配模拟器, 我当时只想骂街,我嘞个操啊,这是要搞死我的节奏啊,你说好好的手机你不用,你嫌屏幕小,用平板,行, 那就用呗, 现在还要用电脑, 然后用模拟器安装, 我特么心态崩了呀,模拟器跟真机不一样,android都知道,模拟器上可以运行的东西在真机上不一样好使, 真机好使的模拟器不一样通过,有的第三方不支持底层架构, 比如找不到方法,不支持x86等一下,所以没办法,咱又不如大厂子的手子,写不出来那么高级的框架。
哎,没办法,谁让拿着工资,就吃这个饭呢, 凑合吧, 干就完了,就尽最大的努力设配就完了,是在不行 那也是没有办法的。除非放弃框架