[英]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¶mName2=value2
http://stackoverflow.com?paramName2=value2¶mName1=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¶mName2=value2
http://stackoverflow.com?paramName1=value1¶mName2=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¶mName2=value2", "http://stackoverflow.com?paramName2=value2¶mName1=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¶mName2=value2", "http://stackoverflow.com?paramName1=value1¶mName2=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¶mName2=value2 http://stackoverflow.com?paramName2=value2¶mName1=value1
允許服務器為參數的順序賦值,並賦予等號的存在,因此根據RFC 3986 ,這些對不是等價的。
http://stackoverflow.com?param name 1=value 1 http://stackoverflow.com?param%20name%201=value%201
並非所有URL庫都將這些視為有效,因為根據RFC 3986,第一個URL不是有效的URL,盡管大多數用戶代理都同意如何將前者轉換為后者。
有一個OkHttp庫可以正確的方式比較URL。
以下是有關它的文章 - https://medium.com/square-corner-blog/okhttps-new-url-class-515460eea661和http://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.