详解okhttp3 请求头不能为中文的坑
2017-09-04 10:59
330 查看
对源码有一定的了解,以为基本可以驾驭了,谁知道,坑来了。
问题描述:
上线接口的某一天,有用户报障,说登录不上,而且陆续有报障。
通过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其实并没有这个判断。
解决方案:
解决方案有以下几种:
- 不要传了(当然这个不符合需求)
- 把源码这个地方改了(也不是太好,不知道会不会引起其他问题)
- 把中文 encode以下(相对较好的办法):
ssid = URLEncoder.encode(ssid);
总结
遇到问题不可怕,主要是要做好分析,及时解决,多做总结,避免后门再次踩同样的坑。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
相关文章推荐
- Retrofit 2.0使用详解,配合OkHttp、Gson,Android最强网络请求框架
- iOS Get方式带中文不能请求网络
- Alamofire的使用和网络请求的封装,解决不能打印中文的问题
- 详解Android中使用OkHttp发送HTTP的post请求的方法
- 解决网站通过tomcat发布后不能请求中文的问题
- okHttp的请求超时以后,连续发送5次请求后就不能再发送请求了
- retrofit+RxJava+okhttp简便封装实现网络请求(详解)
- Android OkHttp 网络请求 使用详解
- Retrofit 2.0使用详解,配合OkHttp、Gson,Android最强网络请求框架
- 笔记:Android OkHttp3网络请求框架详解
- Retrofit 2.0使用详解,配合OkHttp、Gson,Android最强网络请求框架
- Http协议中关于请求与响应中文参数乱码问题详解
- HttpClient请求中文乱码详解
- 详解get请求和post请求参数中文乱码的解决办法
- URL请求不能解决中文请求的问题
- iOS使用AFNetworking请求回来的网络数据,不能显示中文, 新建一个分类解决。
- PLSQL往Oracle数据库插入中文后变为问号 和 启动PLSQL时提示NLS_LANG在客户端不能确定的解决办法
- HTTP请求出错(no resource): Android4.0不能在主线程中进行HTTP请求
- Struts2 get请求出现中文乱码