理解URI

通过一段代码来理解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可以是基于服务器的也可以是基于注册的,基于服务器的授权机构组件的语法如下:
[userinfo@] 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段并把它呈献给该用户。

通过以上的说明,对于程序的输出就比较好理解了。


猜你喜欢

转载自jiangwenfeng762.iteye.com/blog/1621620
URI