OKHttp header、post参数不支持中文的解决办法
来源:互联网 发布:网络写作软件哪个好 编辑:程序博客网 时间:2024/06/14 15:09
现象
项目在接入Okhttp请求框架的时候,发现当header或post参数中包含有中文的时候,都会报一个
Unexpected char xx at xx in xx value: xxx
这种格式的错误,下面把原因和解决办法分享给大家
原因
查看源码可以发现,不论你从什么入口设置header 或 post参数,Okhttp都会对其进行这样一段代码的检查
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 <= '\u001f' || 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 >= '\u007f') { throw new IllegalArgumentException(Util.format( "Unexpected char %#04x at %d in %s value: %s", (int) c, i, name, value)); } }}
而这也就使得当参数中含有中文时就会报错
解决办法
header参数
把使用 requestBuilder.header(name , value)
的地方
替换成requestBuilder.header(name , getValueEncoded(value) )
方法代码如下:
//由于okhttp header 中的 value 不支持 null, \n 和 中文这样的特殊字符,所以这里//会首先替换 \n ,然后使用 okhttp 的校验方式,校验不通过的话,就返回 encode 后的字符串private static String getValueEncoded(String value) { if (value == null) return "null"; String newValue = value.replace("\n", ""); for (int i = 0, length = newValue.length(); i < length; i++) { char c = newValue.charAt(i); if (c <= '\u001f' || c >= '\u007f') { return URLEncoder.encode(newValue, "UTF-8"); } } return newValue;}
post参数
post参数可以通过将键值对转换为byte数组的形式来避免OKhttp的字符检查
requestBuilder.post(RequestBody.create(MediaType.parse("application/x-www-form-urlencoded; charset=utf-8"), getRequestData(postParams).toString().getBytes(“UTF-8”)));private static StringBuffer getRequestData(Map<String, String> params) { StringBuffer stringBuffer = new StringBuffer(); try { for (Map.Entry<String, String> entry : params.entrySet()) { stringBuffer.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } stringBuffer.deleteCharAt(stringBuffer.length() - 1); //删除最后的一个"&" } catch (Exception e) { e.printStackTrace(); } return stringBuffer;}
另外,这里比较重要的还有这句话:
MediaType.parse("application/x-www-form-urlencoded; charset=utf-8"
此处如果没有charset=utf-8
的话,服务端获取中文post参数可能会出现乱码
2 0
- OKHttp header、post参数不支持中文的解决办法
- SASS 不支持中文的解决办法
- Python post中文参数传递出错的一种解决办法
- IIS5不支持中文目录的解决办法
- flex主题/皮肤不支持中文的解决办法
- Tomcat不支持中文路径的解决办法
- mysql不支持中文字符的解决办法
- tomcat不支持中文路径(链接)的解决办法
- AndroidStudio IDE主题不支持中文的解决办法
- Git Bash 不支持中文的简单解决办法
- OKhttp get post 同步 异步 header设置
- Okhttp框架的二次封装,post json格式的参数
- Okhttp的Post请求参数在Interceptor中修改
- okhttp的post请求
- okhttp的post用法
- Django或网站开发时不支持中文以及mysql数据插入不支持中文的解决办法
- post和get提交中文的解决办法
- pycharm不支持中文注释解决办法
- 什么是时间复杂度,什么是P问题、NP问题和NPC问题
- codeforces732c
- SpringBoot中实现邮件找回密码的功能
- Paint、Canvas、Matrix使用讲解(一、Paint) (一)
- Android 自定义View 实现较美观的loading进度条的绘制
- OKHttp header、post参数不支持中文的解决办法
- java 二进制转十进制
- Java解题-杭电OJ-1002题
- Cocos2d-调度器(scheduler)
- 十大OPENGL教程
- matlab 实现最小包围圆
- Treeset的两种排序方法
- ORACLE 11g 切换到oracle账号显示bash 4.1的问题解决方案
- UUID的解释