OKHttp java.lang.IllegalArgumentException: Unexpec
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OKHttp java.lang.IllegalArgumentException: Unexpec相关的知识,希望对你有一定的参考价值。
在使用 okhttp 的时候,head 的一些项是中文,导致网络请求失败,错误类似下面的java.lang.IllegalArgumentException: Unexpected char ...
Header values are (technically) required to be ISO-8859-1 but in practice only ASCII really works and OkHttp validates such (the exception has nothing to do with Retrofit). That string is a custom user agent and you‘ll need to restrict its contents to the ASCII character set when creating it.
具体的代码 ( 在 okhttp3 库里面的 okhttp3.Headers.java ) 如下:
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));
}
}
}
看源码,解决的方法很简单,保证所有的 head 都是符合编码要求。
但是我的情况是,其中的某一些字符不合要求,这部分服务器不关心,而本地却又不知道具体哪些是不和要求的。我的解决思路很简单,挑出不合要求的字符,把这些字符单独转码。
private static String encodeHeadInfo( String headInfo ) {
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0, length = headInfo.length(); i < length; i++) {
char c = headInfo.charAt(i);
if (c <= ‘\u001f‘ || c >= ‘\u007f‘) {
stringBuffer.append( String.format ("\\u%04x", (int)c) );
} else {
stringBuffer.append(c);
}
}
return stringBuffer.toString();
}
这样
以上是关于OKHttp java.lang.IllegalArgumentException: Unexpec的主要内容,如果未能解决你的问题,请参考以下文章
0713-6.2.0-HBase的Thrift Server启动问题
请求 io.undertow.servlet.spec.HttpServletRequestImpl 不是原始的或包装器
OkHttpOkHttp 源码分析 ( 网络框架封装 | OkHttp 4 迁移 | OkHttp 建造者模式 )
OkHttpOkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 )