前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >详解okhttp3 请求头不能为中文的坑

详解okhttp3 请求头不能为中文的坑

作者头像
砸漏
发布2020-10-22 11:28:02
2.1K0
发布2020-10-22 11:28:02
举报
文章被收录于专栏:恩蓝脚本

对源码有一定的了解,以为基本可以驾驭了,谁知道,坑来了。

问题描述:

上线接口的某一天,有用户报障,说登录不上,而且陆续有报障。

通过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, 都会有这个判断:

代码语言:javascript
复制
  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以下(相对较好的办法):
代码语言:javascript
复制
ssid = URLEncoder.encode(ssid);

总结

遇到问题不可怕,主要是要做好分析,及时解决,多做总结,避免后门再次踩同样的坑。

以上就是本文的全部内容,希望对大家的学习有所帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档