我参与了使用Selenium 2和FireFox驱动程序编写(Java / Groovy)浏览器自动化应用程序。
目前我们在野外发现的某些网址存在问题,这些网址显然是使用错误的 URI语法。 (特别是花括号({}
),|
' s和^
' s)。
String url = driver.getCurrentUrl(); // http://example.com/foo?key=val|with^bad{char}acters
当尝试从java.net.URI
返回的字符串构造driver.getCurrentUrl()
时,会抛出URISyntaxException
。
new URI(url); // java.net.URISyntaxException: Illegal character in query at index ...
在构建url
之前 编码整个URI
将无效(据我所知)。
整个网址已经过编码,并且它没有预先设置我能以任何正常方式解析的任何部分。例如,使用此uri-safe字符串,URI
无法知道&
作为查询字符串参数分隔符或%26
(其编码值)之间的差异单个qs-param的内容。
String encoded = URLEncoder.encode(url, "UTF-8") // http%3A%2F%2Fexample.com%2Ffoo%3Fkey%3Dval%7Cwith%5E%7Cbad%7Ccharacters
URI uri = new URI(encoded)
URLEncodedUtils.parse(uri, "UTF-8") // []
目前解决方案是,在构建URI
之前,运行以下(groovy)代码:
["|", "^", "{", "}"].each {
url = url.replace(it, URLEncoder.encode(it, "UTF-8"))
}
但这看起来很脏又错。
我想我的问题是多部分的:
答案 0 :(得分:2)
我们可以对查询字符串参数进行部分编码,如注释中所述,它应该可以工作。
其他方式是使用galimatias库:
import io.mola.galimatias.GalimatiasParseException;
import io.mola.galimatias.URL;
import java.net.URI;
import java.net.URISyntaxException;
public class Main {
public static void main(String[] args) throws URISyntaxException {
String example1 = "http://example.com/foo?key=val-with-a-|-in-it";
String example2 = "http://example.com?foo={bar}";
try {
URL url1 = URL.parse(example1);
URI uri1 = url1.toJavaURI();
System.out.println(url1);
System.out.println(uri1);
URL url2 = URL.parse(example2);
URI uri2 = url2.toJavaURI();
System.out.println(url2);
System.out.println(uri2);
} catch (GalimatiasParseException ex) {
// Do something with non-recoverable parsing error
}
}
}
输出:
http://example.com/foo?key=val-with-a-|-in-it
http://example.com/foo?key=val-with-a-%7C-in-it
http://example.com/?foo={bar}
http://example.com/?foo=%7Bbar%7D
答案 1 :(得分:0)
driver.getCurrentUrl()从浏览器中获取一个字符串,在将其作为URL之前,您应该对该字符串进行URL编码。
请参阅Java URL encoding of query string parameters以获取Java中的示例。
答案 2 :(得分:0)
这对你有用吗?
import java.net.URI;
import java.net.URL;
import java.net.URLEncoder;
public class Sample {
public static void main(String[] args) throws UnsupportedEncodingException {
String urlInString="http://example.com/foo?key=val-with-a-{-in-it";
String encodedURL=URLEncoder.encode(urlInString, "UTF-8");
URI encodedURI=URI.create(encodedURL);
System.out.println("Actual URL:"+urlInString);
System.out.println("Encoded URL:"+encodedURL);
System.out.println("Encoded URI:"+encodedURI);
}
}
输出:
Actual URL:http://example.com/foo?key=val-with-a-{-in-it
Encoded URL:http%3A%2F%2Fexample.com%2Ffoo%3Fkey%3Dval-with-a-%7B-in-it
Encoded URI:http%3A%2F%2Fexample.com%2Ffoo%3Fkey%3Dval-with-a-%7B-in-it
答案 3 :(得分:0)
另一种解决方案是拆分提取的URL,然后使用它们创建所需的URL。这将确保您获得URL类的所有功能。
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
public class Sample {
public static void main(String[] args) throws UnsupportedEncodingException,
URISyntaxException, MalformedURLException {
String uri1 = "http://example.com/foo?key=val-with-a-{-in-it";
String scheme=uri1.split(":")[0];
String authority=uri1.split("//")[1].split("/")[0];
String path=uri1.split("//")[1].split("/")[1].split("\\?")[0];
String query=uri1.split("\\?")[1];
URI uri = null;
uri = new URI(scheme, authority, "/"+path, query,null);
URL url = null;
url = uri.toURL();
System.out.println("URI's Query:"+uri.getQuery());
System.out.println("URL's Query:"+url.getQuery());
}
}