JAVA后端,拼接URL访问,特殊字符异常处理
一般来说,前端传入keyword之前都需要进行urlencode处理,详情见链接
为什么要用 urlencode()
。拿到参数(比如keyword)之后我们可能会需要利用此去拼接其他url,常见的报错有:
1、异常:java.lang.IllegalArgumentException: Illegal group reference
serviceUrl=geturl().replaceall("<keyword>",normalize(keyword));
keyword替换,遇到
字
符
报
错
,
r
e
p
l
a
c
e
a
l
l
支
持
正
则
表
达
式
,
由
于
第
一
个
参
数
支
持
正
则
表
达
式
,
后
一
个
参
数
中
出
现
$
,
会
按
照
$
1
$
2
的
模
式
进
行
匹
配
。
当
编
译
器
发
现
“
”后跟的不是整数的时候,就会抛出“非法的组引用”的异常。
关于得到地址中的数据,使用JDK中的urlConnection,详见
urlConnection介绍
。
URL url = new URL("http://www.baidu.com");
URI uri = new URI(url.getProtocol(), null, url.getHost(), url.getPort(), url.getPath(), url.getQuery(),null);
String url=uri.toASCIIString();
URL url =
URLConnection rulConnection = url.openConnection();// 此处的urlConnection对象实际上是根据URL的 ,忽略该类的Host,user-agent等参数设置
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
resultBuffer.append(line);
}//这样就可以得到内容了
解决办法之一就是把replaceall改成replace函数。现在说的另外两个坑是”#”和”&”字符。
2、#。URL中的#号表示链接结束,URL中#后面的字符都被认为位置标识符,用来作为识别标记或其他用途,也就是说#后面的的所有字符都不会被传入,这样可能后面的一些参数并没有传入进来,异常类型比较多。
问题的原因是因为前端传入参数时候会urlencode,而且我们用的URI函数有编码的功能,但是URI并不会编码#、@、&(肯定不可以,不然参数没办法区分了)和、$、*等,可以解析^为%5E,%为%25。以上字符urlencode都可以解析。
3、&。通常多个参数传递用“&”符号来隔开。如果keyword中包含&,就可能会导致传入结果并不是我们实际想传入的。
解决办法:第二和第三两种异常常是因为用户输入错误乱输入或者直接复制粘贴等等造成的,可以特殊字符替换为空字符。建议在URI函数之前,将#编码为%23,将&编码为%26。然后再URI函数之后将%2523替换为%23,将%2536替换为%26,之所以分开替换不直接.replace.(“%25”,”%”),因为有一种可能是用户输入”%”。