详解okhttp3请求头不能为中⽂的坑
对源码有⼀定的了解,以为基本可以驾驭了,谁知道,坑来了。
问题描述:
上线接⼝的某⼀天,有⽤户报障,说登录不上,⽽且陆续有报障。
通过log 发现登录不上,都有⼀个类似的报错:
“java.lang.IllegalArgumentException: Unexpected char 0x514d at 4 in wifiSsid value: "360免费WiFi-DP" at ”
什么?怎么和wifiSsid有关系了?后来查了⼀下代码,发现确实在登录接⼝上通过请求头的形式上传了 wifissid, 也就是连接的wifi的名字。Exception描述是第四个 char ,也就是“免”字?难道是因为中⽂的原因?当时是这么猜测的。
源码查询
猜测并不能作为判断的标准,然后做了⼀下测试,果然连接含义中⽂名字的wifi就有问题,也就是不能添加中⽂到请求头⾥⾯。这是为什么呢?最后还是通过源码进⾏的求证:
在okhttp的源码Header.java,发现set 和add header, 都会有这个判断:
private void checkNameAndValue(String name, String value) {
if (name == null) throw new NullPointerException("name == null");
if (name.isEmpty()) throw new IllegalArgumentException("name is empty");
for (int i = 0, length = name.length(); i < length; i++) {
char c = name.charAt(i);
if (c <= '\u0020' || c >= '\u007f') {
throw new IllegalArgumentException(Util.format(
"Unexpected char %#04x at %d in header name: %s", (int) c, i, name));
}
}
if (value == null) throw new NullPointerException("value == null");
for (int i = 0, length = value.length(); i < length; i++) {
char c = value.charAt(i);
if ((c <= '\u001f' && c != '\t') || c >= '\u007f') {
throw new IllegalArgumentException(Util.format(
"Unexpected char %#04x at %d in %s value: %s", (int) c, i, name, value));
}
}
}
嗷,No,果然是这样,踩到深坑了。⽆论是header的 Key 和Value都是不能含有中⽂的,⼀旦判定为有中⽂的出现,就会抛出异常,中断请求。
后⾯想了⼀下,以前使⽤okhttp2的时候,也有上传相同的请求头,为什么就没有这个问题呢?也同样去查看了⼀下okhttp2的源码,发现这个判断是okhttp3才有的,okhttp2其实并没有这个判断。
解决⽅案:nullpointerexception为什么异常
解决⽅案有以下⼏种:
不要传了(当然这个不符合需求)
把源码这个地⽅改了(也不是太好,不知道会不会引起其他问题)
把中⽂ encode以下(相对较好的办法):
ssid = de(ssid);
总结
遇到问题不可怕,主要是要做好分析,及时解决,多做总结,避免后门再次踩同样的坑。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。