比较URL与Java中的参数

时间:2012-09-19 08:56:28

标签: java url selenium

这两个网址应该是相同的:

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

但是使用URL类中的'equals()',我发现它们是不同的。我该如何比较它们?

编辑:此问题的一些背景

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

6 个答案:

答案 0 :(得分:1)

因此,如果我做对了,你想要比较两个URL,无论查询部分的顺序如何。

URL课程中似乎没有这方法,所以你必须自己编写。 此外,URLfinal,您无法覆盖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()比较两者。

- 这样可以解决问题,我想是这样......