这两个网址应该是相同的:
http://localhost?asdf=1&qwer=2
http://localhost?qwer=2&asdf=1
但是使用URL类中的'equals()',我发现它们是不同的。我该如何比较它们?
编辑:此问题的一些背景
我正在为某些网址映射创建Selenium测试。我有旧的url,它应该映射到的URL和实际的url。我需要将应该是url与实际url进行比较。网址列表由客户端创建。如果参数列表相同,则具有相同参数和值的URL被认为是有效的,并且它们都具有正确的值(这些参数的顺序无关紧要)
答案 0 :(得分:1)
因此,如果我做对了,你想要比较两个URL,无论查询部分的顺序如何。
在URL
课程中似乎没有这方法,所以你必须自己编写。
此外,URL
为final
,您无法覆盖URL.equals(Object)
。
您的方法可以从致电sameFile()
开始
如果评估结果为true
,则调用getQuery()
,然后将其拆分为组件 - 可能使用String.split("\&")。从那以后,您可以评估参数是否相同
另外,不要忘记检查“#fragment”是否相等,如果这对您的应用程序很重要。
答案 1 :(得分:0)
URL / URI等于方法被破坏。至少它没有像你期望的那样提供结果。 它有很多奇怪的东西。您可能有兴趣阅读
Mr. Gosling – why did you make URL equals suck?!?
或者
How to compare two URLs in java?
所以,不要指望这很容易。 您可以为特定情况创建自定义比较器,但通常您可能需要解析url字符串。
希望这有帮助
答案 2 :(得分:0)
我不认为你会喜欢它,但你可以做类似
的事情URL url = new URL("http://localhost?asdf=1&qwer=2");
URL url2 = new URL("http://localhost?qwer=2&asdf=1");
System.out.println(isEqual(url, url2));
public static boolean isEqual(URL url1, URL url2) {
boolean isEqual = url1.getAuthority().equals(url2.getAuthority()) &&
url1.getPort() == url2.getPort() &&
url1.getHost().equals(url2.getHost()) &&
url1.getProtocol().equals(url2.getProtocol());
if (isEqual) {
String query1 = url1.getQuery();
String query2 = url2.getQuery();
if (query1 != null && query2 != null) {
if (query1.length() == query2.length()) {
List<String> list1 = getParameters(query1);
List<String> list2 = getParameters(query2);
for (int index = 0; index < list1.size(); index++) {
String value1 = list1.get(index);
String value2 = list2.get(index);
if (!value1.equals(value2)) {
isEqual = false;
break;
}
}
} else {
isEqual = false;
}
} else {
isEqual = false;
}
}
return isEqual;
}
protected static List<String> getParameters(String value) {
List<String> parameters = new ArrayList<String>(25);
String[] values = value.split("&");
for (String par : values) {
if (!par.contains("=")) {
par += "=null";
}
parameters.add(par);
}
Collections.sort(parameters);
return parameters;
}
答案 3 :(得分:0)
您可以使用String类中的可用功能来完成此操作。
此方法将网址分为两部分,一个在“?”之前。后面的一个(如果不存在“?”或参数,则可以)。如果网址前面有“?”是相等的,对于我们而言,两者是“相等的”。
public boolean urlsMatchWithoutQueryParameters(String firstUrl, secondUrl) {
// Get the portion of the URLs before the "?", and before all parameters.
String firstUrlWithoutParameters = firstUrl.split("\\?", 2)[0];
String secondUrlWithoutParameters = secondUrl.split("\\?", 2)[0];
return firstUrlWithoutParameters.equals(secondUrlWithoutParameters);
}
代码有点拥挤,因此您可以执行以下操作将String逻辑拉出到帮助器中:
public boolean urlsMatchWithoutQueryParameters(String firstUrl, secondUrl) {
return getUrlWithoutParameters(firstUrl).equals(getUrlWithoutParameters(secondUrl));
}
public String getUrlWithoutParameters(String url) {
// Get the portion of the URL before the "?", and before all parameters.
return url.split("\\?", 2)[0];
}
注意::这会忽略网址锚(例如,网址www.example.com/profiles/user123#friends中的#photos)。
要定位锚,只需将"\\?"
中的"#"
替换为split("\\?", 2)
。
答案 4 :(得分:-1)
我喜欢这个问题所以我写了这个小小的演示。 (对不起,我使用StringUtils类作为子串)
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang.StringUtils;
public class URLDemo
{
/**
* @param args
* @throws MalformedURLException
*/
public static void main(String[] args)
throws MalformedURLException
{
String url1 = "http://localhost?asdf=1&qwer=2";
String url2 = "http://localhost?qwer=2&asdf=1";
URL url11 = new URL(StringUtils.substringBefore(url1, "?"));
URL url22 = new URL(StringUtils.substringBefore(url2, "?"));
if (url11.equals(url22))
{
// url are equal but still need to check the parameters
List<String> params1 = Arrays.asList(StringUtils.split(StringUtils.substringAfter(url1, "?"), "&"));
List<String> params2 = Arrays.asList(StringUtils.split(StringUtils.substringAfter(url2, "?"), "&"));
// need to check both ways
if (params1.containsAll(params2) && params2.containsAll(params1))
{
System.out.println("URLs are the same");
}
else
{
System.out.println("URLs are different");
}
}
}
}
答案 5 :(得分:-2)
这些两个网址实际上是不同的
http://localhost?asdf=1&qwer=2
http://localhost?qwer=2&asdf=1
////////编辑部//////////
试试这个......
- 在两者网址上使用openStream()
。
- 将它们保存为2 String
个对象或StringBuilder
。
- 现在使用equals()
比较两者。
- 这样可以解决问题,我想是这样......