理解URI
程序员文章站
2022-03-10 18:06:56
...
通过一段代码来理解URI的构成:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URISyntaxException;
public class UriTest {
static void outputGetMethod(Class<? extends Object> c,Object obj){
String get = "get";
for(Method m:c.getDeclaredMethods()){
if(m.getName().startsWith(get)){
try {
System.out.println(m.getName()+":"+m.invoke(obj, (Object[])null));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
/**
* @param args
* @throws URISyntaxException
*/
public static void main(String[] args) throws URISyntaxException {
URI uri = new URI("ftp://[email protected]:90/public/notes?text=shakespeare#hamlet");
UriTest.outputGetMethod(URI.class, uri);
}
}
输出结果:
getPath:/public/notes
getScheme:ftp
getAuthority:[email protected]:90
getFragment:hamlet
getQuery:text=shakespeare
getHost:x.com
getUserInfo:george
getPort:90
getRawSchemeSpecificPart://[email protected]:90/public/notes?text=shakespeare
getSchemeSpecificPart://[email protected]:90/public/notes?text=shakespeare
getRawAuthority:[email protected]:90
getRawUserInfo:george
getRawPath:/public/notes
getRawQuery:text=shakespeare
getRawFragment:hamlet
URI分为绝对URI和相对URI。
URI的构成语法如下:
[scheme:] scheme-specific-part
scheme:命名URI的名字空间的标识符,其中绝对URI scheme是必选的,而相对URI scheme可以没有。
scheme-specific-part的构成如下:
[//authority] [path] [?query] [#fragment]
authority:可选的,表示该URI的命名机构。如果URI中有authority,那么它一定是以一对正斜杠开始的,并且它以后面的正斜杠、问号或没有其它符号结束。authority可以是基于服务器的也可以是基于注册的,基于服务器的授权机构组件的语法如下:
[[email protected]] host [:port]
基于服务器的授权机构组件可以随意的以用户信息(例如用户名)开始,后面跟着一个@符号,紧接着是主机的名称,以及冒号和端口号。例如[email protected]:90就是一个基于服务器的授权机构组件,其中jeff包含了用户信息,x.com包含了主机,90包含了端口。
path:可选的,根据授权机构组件(如果提供了)或大纲(如果没有授权机构组件)识别资源的定位(或位置)。路径(path)可以分成一系列的路径片断(path segment),每个路径片断使用正斜杠与其它的路径片断隔开。如果路径的第一个路径片断以一个正斜杠开始,该路径就被认为是绝对的。否则路径就被认为是相对的。例如,/a/b/c由三个路径片断--a、b和c组成了一个路径,此外,这个路径是绝对的,因为第一个路径片断(a)的前缀是正斜杠。
query:可选的,识别要传递给某种资源的数据。这种资源使用该数据获取或生成其它的传递回调用者的数据。例如,http://www.somesite.net/a?x=y, x=y就是一个查询(query),在这个查询中,x=y是传递给某种资源的数据--x是某种实体的名称,y是该实体的值。
fragment:可选的,尽管该组件作为URI的一部分出现,但不是绝对的。当使用URI进行某种检索操作时,后面执行操作的软件使用fragment聚焦于软件感兴趣的资源部分(在该软件成功检索到资源的数据后)。
测试程序中用到的URI:
ftp://[email protected]:90/public/notes?text=shakespeare#hamlet
这个URI把ftp识别为大纲,把[email protected]:90识别为基于服务器的授权机构(其中george是用户信息,x.com是主机,90是端口),把/public/notes识别为路径,把text=shakespeare识别为查询,把hamlet识别为片断。本质上它是一个叫做george的用户希望通过/public/notes路径在服务器x.com的90端口上检索shakespeare文本的hamlet信息。在shakespeare成功的返回到该程序后,程序定位hamlet段并把它呈献给该用户。
通过以上的说明,对于程序的输出就比较好理解了。