欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

理解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段并把它呈献给该用户。

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


相关标签: java URI

上一篇: 路由

下一篇: 本地AAA认证