我可以用什么java库来比较两个URL是否相等?

Dan*_*lan 6 java url

这个问题在这里被问到:

但我对答案完全不满意.我需要一种方法来比较两个URL的相等性,理想情况下我不会手工编写它.这个库需要理解这些URL是平等的

http://stackoverflow.com
https://stackoverflow.com/

https://stackoverflow.com/questions/ask
https://stackoverflow.com/questions/ask/

http://stackoverflow.com?paramName=
http://stackoverflow.com?paramName

http://stackoverflow.com?paramName1=value1&paramName2=value2
http://stackoverflow.com?paramName2=value2&paramName1=value1

http://stackoverflow.com?param name 1=value 1
http://stackoverflow.com?param%20name%201=value%201
Run Code Online (Sandbox Code Playgroud)

这些网址不相同:

https://stackoverflow.com/questions/ask
https://stackoverflow.com/questionz/ask

http://stackoverflow.com?paramName1=value1&paramName2=value2
http://stackoverflow.com?paramName1=value1&paramName2=value3
Run Code Online (Sandbox Code Playgroud)

和其他复杂的事情一样.我在哪里可以找到这样的图书馆?

顺便说一句,这是一个单元测试:

import org.junit.Test;

import java.net.URI;
import java.net.URISyntaxException;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame;

public class UriTest {

    @Test
    public void equality() throws URISyntaxException {
        assertUrlsEqual("http://stackoverflow.com", "https://stackoverflow.com/");
        assertUrlsEqual("https://stackoverflow.com/questions/ask", "https://stackoverflow.com/questions/ask/");
        assertUrlsEqual("http://stackoverflow.com?paramName=", "http://stackoverflow.com?paramName");
        assertUrlsEqual("http://stackoverflow.com?paramName1=value1&paramName2=value2", "http://stackoverflow.com?paramName2=value2&paramName1=value1");
        assertUrlsEqual("http://stackoverflow.com?param name 1=value 1", "http://stackoverflow.com?param%20name%201=value%201");
    }

    @Test
    public void notEqual() throws URISyntaxException {
        assertUrlsNotEqual("https://stackoverflow.com/questions/ask", "https://stackoverflow.com/questionz/ask");
        assertUrlsNotEqual("http://stackoverflow.com?paramName1=value1&paramName2=value2", "http://stackoverflow.com?paramName1=value1&paramName2=value3");
    }

    private void assertUrlsNotEqual(String u1, String u2) throws URISyntaxException {

//...?
    }

    private void assertUrlsEqual(String u1, String u2) throws URISyntaxException {
//...?
    }

}
Run Code Online (Sandbox Code Playgroud)

Mik*_*uel 8

java.net.URI将比较没有网络请求的两个URL(方式java.net.URL确实如此),并且您可以使用该normalize方法创建具有绝对路径路径的URL - 规范.

您的示例存在一些问题:

http://stackoverflow.com?paramName=
http://stackoverflow.com?paramName

http://stackoverflow.com?paramName1=value1&paramName2=value2
http://stackoverflow.com?paramName2=value2&paramName1=value1
Run Code Online (Sandbox Code Playgroud)

允许服务器为参数的顺序赋值,并赋予等号的存在,因此根据RFC 3986,这些对不是等价的.

http://stackoverflow.com?param name 1=value 1
http://stackoverflow.com?param%20name%201=value%201
Run Code Online (Sandbox Code Playgroud)

并非所有URL库都将这些视为有效,因为根据RFC 3986,第一个URL不是有效的URL,尽管大多数用户代理都同意如何将前者转换为后者.

  • 好的,谢谢你的信息.但是通过在URI上使用`normalize()`,我的所有`相等'测试仍然失败,主要是出于你给出的原因.这是规范,然后就是现实.实际上,大多数服务器都会返回同样的东西,因为这些"平等"的URL.这就是我想要测试的内容,但这个答案(虽然信息非常丰富)并没有帮助我达到这个目标. (2认同)