gpt4 book ai didi

Java URL 类 getPath()、getQuery() 和 getFile() 与 RFC3986 URI 语法不一致

转载 作者:搜寻专家 更新时间:2023-10-31 20:01:38 24 4
gpt4 key购买 nike

我正在编写一个半包装 Java 的 URL 类 的实用程序类,并且我已经编写了一堆测试用例来验证我用自定义实现包装的方法。我不明白某些 Java 的某些 URL 字符串的 getter 的输出。

根据RFC 3986规范,路径组件定义如下:

The path is terminated by the first question mark ("?") or number sign   
("#") character, or by the end of the URI.

查询组件定义如下:

The query component is indicated by the first question
mark ("?") character and terminated by a number sign ("#") character
or by the end of the URI.

我有几个测试用例,它们被 Java 视为有效的 URL,但是路径、文件和查询的 getter 没有返回我预期的值:

URL url = new URL("https://www.somesite.com/?param1=val1");

System.out.print(url.getPath());
System.out.println(url.getFile());
System.out.println(url.getQuery());

以上结果如下:

//?param1=val1
param1=val1
<empty string>

我的另一个测试用例:

URL url = new URL("https://www.somesite.com?param1=val1");

System.out.print(url.getPath());
System.out.println(url.getFile());
System.out.println(url.getQuery());

以上结果如下:

?param1=val1
param1=val1
<empty string>

根据 Java URL 的文档:

public String getFile()

Gets the file name of this URL. The returned file portion will be the
same as getPath(), plus the concatenation of the value of getQuery(), if
any. If there is no query portion, this method and getPath() will return
identical results.

Returns:
the file name of this URL, or an empty string if one does not exist

因此,当调用 getQuery() 时,我的测试用例会生成空字符串。在这种情况下,我希望 getFile() 返回与 getPath() 相同的值。事实并非如此。

我曾期望两个测试用例的输出如下:

<empty string>
?param1=val1
param1=val1

也许我对 RFC 3986 的解释不正确。但是我看到的输出也不符合 URL 类的文档?任何人都可以解释我所看到的吗?

最佳答案

这里是一些基于你的片段的可执行代码:

import java.net.MalformedURLException;
import java.net.URL;

public class URLExample {
public static void main(String[] args) throws MalformedURLException {
printURLInformation(new URL("https://www.somesite.com/?param1=val1"));
printURLInformation(new URL("https://www.somesite.com?param1=val1"));
}

private static void printURLInformation(URL url) {
System.out.println(url);
System.out.println("Path:\t" + url.getPath());
System.out.println("File:\t" + url.getFile());
System.out.println("Query:\t" + url.getQuery() + "\n");
}

}

工作正常,这是您可能预期的结果。唯一的区别是,您使用了一个 System.out.print,然后是 System.out.println在同一行中打印路径和文件的结果。

https://www.somesite.com/?param1=val1
Path: /
File: /?param1=val1
Query: param1=val1

https://www.somesite.com?param1=val1
Path:
File: ?param1=val1
Query: param1=val1

关于Java URL 类 getPath()、getQuery() 和 getFile() 与 RFC3986 URI 语法不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30003540/

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