网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

OkHttpIllegalArgumentException异常解决方法

在使用 okhttp 的时候,head 的一些项是中文,导致网络请求失败,错误类似下面的

成都创新互联公司成立与2013年,先为四平等服务建站,四平等地企业,进行企业商务咨询服务。为四平企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

java.lang.IllegalArgumentException: Unexpected char ...

找了一圈发现是 okhttp 对 head 的编码做了验证

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();
}

这样


新闻名称:OkHttpIllegalArgumentException异常解决方法
新闻来源:http://bjjierui.cn/article/iphcse.html

其他资讯