繁体   English   中英

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

[英]What java library can I use to compare two URLs for equality?

这个问题在这里被问到:

但我对答案完全不满意。 我需要一种方法来比较两个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

这些网址不相同:

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

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

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

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

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 {
//...?
    }

}

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 

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

 http://stackoverflow.com?param name 1=value 1 http://stackoverflow.com?param%20name%201=value%201 

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

从2018年更新

有一个OkHttp库可以正确的方式比较URL。

以下是有关它的文章 - https://medium.com/square-corner-blog/okhttps-new-url-class-515460eea661http://square.github.io/okhttp/

但请记住,它认为这些是不同的URL:

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

stackoverflow.com
www.stackoverflow.com

你可以这样做:

HttpUrl url = HttpUrl.parse("http://google.com");
return url.equals(url2);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM