gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:02:16 35 4
gpt4 key购买 nike

这里有人问过这个问题:

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

这些 URL 不相同:

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 ( the way java.net.URL does ),你可以使用 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,尽管大多数用户代理同意如何将前者转换为后者。

关于java - 我可以使用什么 java 库来比较两个 URL 是否相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18280818/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com