请求头不支持中文,导致连接失败
现在市面上有很多稀奇古怪的设备,在咱们封装请求头信息的时候,会把设备的一些信息传到回台,便于统计设备;这就需要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等一下,所以没办法,咱又不如大厂子的手子,写不出来那么高级的框架。
哎,没办法,谁让拿着工资,就吃这个饭呢, 凑合吧, 干就完了,就尽最大的努力设配就完了,是在不行 那也是没有办法的。除非放弃框架
推荐阅读