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

发布时间 - 2026-01-11 03:05:46    点击率:

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

问题描述:

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

通过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);

总结

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

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


# okhttp3  # 请求头  #   # 添加请求头  # 浅谈Okhttp去除请求头user-agent  # 不上  # 深坑  # 传了  # 都是  # 这是  # 就会  # 都有  # 来了  # 也有  # 会有  # 是因为  # 看了  # 就有  # 是这样  # 会不会  # 这个问题  # 有一定  # 较好  # 想了  # 几种 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 教你用AI将一段旋律扩展成一首完整的曲子  Laravel如何处理表单验证?(Requests代码示例)  黑客入侵网站服务器的常见手法有哪些?  HTML 中动态设置元素 name 属性的正确语法详解  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  nginx修改上传文件大小限制的方法  Windows Hello人脸识别突然无法使用  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  ,南京靠谱的征婚网站?  Laravel怎么实现验证码(Captcha)功能  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Laravel如何使用Service Container和依赖注入?(代码示例)  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  如何在云服务器上快速搭建个人网站?  JavaScript如何实现路由_前端路由原理是什么  黑客如何通过漏洞一步步攻陷网站服务器?  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  JS弹性运动实现方法分析  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Java解压缩zip - 解压缩多个文件或文件夹实例  音响网站制作视频教程,隆霸音响官方网站?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  简历没回改:利用AI润色让你的文字更专业  零基础网站服务器架设实战:轻量应用与域名解析配置指南  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  如何基于PHP生成高效IDC网络公司建站源码?  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  Python3.6正式版新特性预览  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  如何在腾讯云服务器上快速搭建个人网站?  如何打造高效商业网站?建站目的决定转化率  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  Laravel如何为API编写文档_Laravel API文档生成与维护方法  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  微信小程序 require机制详解及实例代码  如何实现javascript表单验证_正则表达式有哪些实用技巧  网页设计与网站制作内容,怎样注册网站?  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Swift中循环语句中的转移语句 break 和 continue