6

这两个网址应该相同:

http://localhost?asdf=1&qwer=2
http://localhost?qwer=2&asdf=1

但是使用 URL 类中的“equals()”,我知道它们是不同的。我该如何比较它们?

编辑:关于这个问题的一些背景

我正在为一些 url 映射创建一个 Selenium 测试。我有旧的 url,它应该映射到的 url 和实际的 url。我需要将应该的 url 与实际的 url 进行比较。url 列表由客户端创建。如果参数列表相同并且它们都具有正确的值(这些参数的顺序无关紧要),则具有相同参数和值的 URL 被认为是有效的

4

6 回答 6

1

因此,如果我做对了,您想比较两个 URL,而不管查询部分的顺序如何。

课堂上似乎没有这样的方法URL,所以你必须自己编写。另外,URLfinal不能覆盖URL.equals(Object).

您的方法可以从调用sameFile().
如果计算结果为true,则调用getQuery(),并将其拆分为组件 - 可能使用String.split("\&")。从那里开始,您评估参数是否相同。
另外,不要忘记检查“#fragment”是否相等,如果这对您的应用程序很重要。

于 2012-09-19T09:13:25.550 回答
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;

}
于 2012-09-19T09:27:45.837 回答
0

URL/URI equals 方法已损坏。至少它没有提供您期望的结果。它有很多奇怪的东西。您可能有兴趣阅读

高斯林先生——你为什么让 URL 等于烂?!?

或者可能

如何比较java中的两个URL?

所以,不要指望这会很容易。您可以为您的特定情况创建自定义比较器,但通常您可能必须解析 url 字符串。

希望这可以帮助

于 2012-09-19T09:13:08.467 回答
0

您可以使用 String 类中提供的功能来完成此操作。

这种方法将 URL 分成两部分,“?”之前的部分。和之后的一个(如果没有“?”或参数也可以)。如果“?”之前的 URL 是等价的,就我们的目的而言,两者是“相等的”。

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];
}

注意:这会忽略 URL 锚点(例如,URL www.example.com/profiles/user123#friends 中的#photos)。
对于锚点,只需替换"\\?""#"in split("\\?", 2)

于 2018-09-06T06:20:17.283 回答
-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");
            }
        }
    }

}
于 2012-09-19T09:22:58.387 回答
-2

那么这两个网址实际上是不同的

http://localhost?asdf=1&qwer=2
http://localhost?qwer=2&asdf=1

//////// 编辑部分 //////////

尝试这个....

-openStream()两个网址上使用。

-将它们都保存为 2 个String对象,或者StringBuilder改为。

-现在使用 . 比较它们equals()

-这将解决问题,我想是的......

于 2012-09-19T08:59:51.613 回答