Java URL Class getPath()、getQuery() 和 getFile() 与 RFC3986 URI 语法不一致
Java URL Class getPath(), getQuery() and getFile() inconsistent with RFC3986 URI Syntax
我正在编写一个实用程序 class 来半包装 Java 的 URL class
,并且我已经编写了一堆测试用例来验证我用定制实施。我不明白某些 Java 的某些 URL
字符串的吸气剂的输出。
根据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 视为有效 URLs,但是路径、文件和查询的 getter 没有 return 我预期的值:
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()
到 return 与 getPath()
的值相同。事实并非如此。
我预计两个测试用例的输出如下:
<empty string>
?param1=val1
param1=val1
也许我对 RFC 3986 的解释不正确。但是我看到的输出也不符合 URL class 的文档?谁能解释一下我看到的是什么?
这里是一些基于您的片段的可执行代码:
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
我正在编写一个实用程序 class 来半包装 Java 的 URL class
,并且我已经编写了一堆测试用例来验证我用定制实施。我不明白某些 Java 的某些 URL
字符串的吸气剂的输出。
根据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 视为有效 URLs,但是路径、文件和查询的 getter 没有 return 我预期的值:
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()
到 return 与 getPath()
的值相同。事实并非如此。
我预计两个测试用例的输出如下:
<empty string>
?param1=val1
param1=val1
也许我对 RFC 3986 的解释不正确。但是我看到的输出也不符合 URL class 的文档?谁能解释一下我看到的是什么?
这里是一些基于您的片段的可执行代码:
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