簡體   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