java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in es
Java调用 URLDecoder.decode(str, “UTF-8”); 抛出以上的异常,其主要原因是% 在URL中是特殊字符,需要特殊转义一下,
上面的字符串中’%’是一个中文字符’是’,而转换的实现是将%后面的两个字符一起转为一个16进制数。拿”%是”来转换数字,肯定会有NumberFormatException异常。
类似的如果请求字符串中有’+’,也会有问题。因为’+’被当做空格使用了。
一个解决办法就是将%替换为%25。
1 | data = data.replaceAll("%(?![0-9a-fA-F]{2})", "%25"); |
这里使用了一个特殊正则表达式:零宽负向先行断言(zero-width negative lookahead assertion),模式为(?!pattern),代表字符串中的一个位置,紧接该位置之后的字符序列不能匹配pattern。%(?![0-9a-fA-F]{2})意思是’%’开始,但是后面两个字符不是数字,也不是字母。
Android版本27以上not permitted by network security policy
由于 Android P(版本27以上) 限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉。
如果当前应用的请求是 htttp 请求,而非 https ,这样就会导系统禁止当前应用进行该请求
解决办法:
- (推荐)服务器和本地应用都改用 https (推荐)
- 设置targetSdkVersion <= 27
- 在 res 下新建一个 xml 目录,然后创建一个名为:network_security_config.xml 文件 ,该文件内容如下并在 AndroidManifest.xml application增加配置
1
2
3
4<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>1
android:networkSecurityConfig="@xml/network_security_config"
Received close_notify during handshake
问题存在原因:这是Android编译错误,jcenter里面的东西下载不了引起的。
问题解决:在项目的build.gradle文件中将jcenter()换成阿里的源,具体示例代码如下。修改之后再重新Sync Project即可。
1 | repositories { |