如下方法报了一个 java.net.URISyntaxException异常 为什么会报这个异常呢?我是url 出问题了吗?
调用如下方法报的该异常:
public static boolean isValidUrl(String urlString) {
URI uri = null;
try {
uri = new URI(urlString);
} catch (URISyntaxException e) {
//java.net.URISyntaxException解决办法
return false;
}
if (uri == null || uri.getHost() == null) {
return false;
}
String scheme = uri.getScheme();
if ("http".equalsIgnoreCase(scheme) || "https".equalsIgnoreCase(scheme)) {
return true;
}
return false;
}
java.net.URISyntaxException: Illegal character in query at index 209: https://mmember.jiuxian.com/club/clubPay?departmentId=101&departmentName=%e9%85%92%e5%9f%8e-%e6%b2%b3%e5%8d%97%e6%bf%ae%e9%98%b3%e5%b8%82%e5%8d%8e%e9%be%99%e5%8c%ba%e9%bb%84%e6%b2%b3%e4%b8%9c%e8%b7%af%e5%ba%97
拿到url 经过URLEncode 转为原始Url为:
https://mmember.jiuxian.com/club/clubPay?departmentId=101&departmentName=酒城-河南濮阳市华龙区黄河东路店
感觉没问题呀,这是那里出错的?
从网上了解到:
报 java.net.URISyntaxException异常的原因是因为地址中涉及了特殊字符,如‘|’‘&’等。
java.net.URISyntaxException的解决办法
查看原始连接确实如此: 确实包含 & 特殊字符, 为什么会包含 & 呢,urlEncode后不应该呀,难道编码错了?
拿到url后我们 进行UrlDecode ,再进行一次UrlEncode 得到的内容如下:
https://mmember.jiuxian.com/club/clubPay?departmentId%3d101%26departmentName%3d%e9%85%92%e5%9f%8e-%e6%b2%b3%e5%8d%97%e6%bf%ae%e9%98%b3%e5%b8%82%e5%8d%8e%e9%be%99%e5%8c%ba%e9%bb%84%e6%b2%b3%e4%b8%9c%e8%b7%af%e5%ba%97
两次内容果然不同,生成二维码后,扫码跳转ok。
服务器人员应该是对url 了解不是太深入只对第二个参数进行了编码,造成的该问题
https://mmember.jiuxian.com/club/clubPay?departmentId=101&departmentName=酒城-河南濮阳市华龙区黄河东路店
字符 urlEncode后的内容
= %3d
% %25
& %26
? %3f
空格 +
uri连接中 参数是一个完整的uri 如何解析 ?
private String getLinkInfo() {
try {
Intent intent = getIntent();
String action = intent.getAction();
if (Intent.ACTION_VIEW.equals(action)) {
Uri uri = intent.getData();
if (uri != null) {
/**
* 使用uri.getQueryParameter("param") 解析url时, 会导致只能取到跳转链接和链接中的第一个参数,后面参数都取不到
* 例如:
* jiuxian://app/link?param=https://m.jiuxian.com/m_v1/dynamic/mob01/151289?deeplink=1&netEnv=wifi&flag=android&suptwebp=1&deeplink=1&from=singlemessage&isappinstalled=0
* 当使用uri.getQueryParameter("param")时 只能获取https://m.jiuxian.com/m_v1/dynamic/mob01/151289?deeplink=1 部分
* **/
String query = uri.getQuery();
int start = query.indexOf('=');
return query.substring(start + 1, query.length());
}
}
} catch (Exception e) {
}
return "";
}
只需要将参数进行一次url decode 即可。
Uri.Builder builder = new Uri.Builder();
Uri uri = builder.scheme("jiuxian")
.authority("app")
.appendPath("link")
.appendQueryParameter("param", Uri.encode("https://m.jiuxian.com/m_v1/dynamic/mob01/151289?deeplink=1&netEnv=wifi&flag=android&suptwebp=1&deeplink=1&from=singlemessage&isappinstalled=0")).build();
String param = uri.getQueryParameter("param");
System.out.println(Uri.decode(param));
网友评论