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

Java开发笔记(一百零七)URL地址的组成格式

程序员文章站 2022-03-20 14:38:21
URL的全称是Uniform Resource Locator,意思是统一资源定位符,俗称网络地址或网址。网络上的每个文件及接口,都有对应的URL网址,它规定了其他设备如何通过一系列的路径找到自己,犹如网购的包裹一路送至收货地址所描述的地点。现实生活中的通讯地址,一般遵循固定的格式,比如“××省×× ......

url的全称是uniform resource locator,意思是统一资源定位符,俗称网络地址或网址。网络上的每个文件及接口,都有对应的url网址,它规定了其他设备如何通过一系列的路径找到自己,犹如网购的包裹一路送至收货地址所描述的地点。现实生活中的通讯地址,一般遵循固定的格式,比如“××省××市××区××小区×××”;网络地址也有相应的命名规则,比如新华网的首页地址为“http://www.news.cn”,当然该地址比较简单,还能造出更复杂的url如“http://www.news.cn:8080/public/getvalidatecode?time=123#index”(该网址纯属虚构)。虽然普通用户平时上网只消打开网页接着在各类链接之间跳来跳去,但是作为程序员必须弄清楚这些链接地址的格式涵义,这样才能学好网络通信的编程开发。仍以网址“http://www.news.cn:8080/public/getvalidatecode?time=123#index”为例,该url包含了网络地址的各项组成部分,具体细节如下图所示。

Java开发笔记(一百零七)URL地址的组成格式
接下来对上图的url字符串补充详细说明,从左到右依序介绍如下:
1、最开头的http表示该地址采用的网络协议,它的全称是“hypertext transfer protocol”,意思是超文本传输协议。除了http,常见的网络协议还有https、ftp、file、telnet等等。
2、协议后面越过两个斜杆,紧跟着的是该网址所在的域名,也叫主机名称。这块早已为大众所熟知,除了新华网的www.news.cn,还有*电视台的www.cctv.com、人民日报的www.people.com.cn等等。
3、域名后面以冒号隔开的数字叫做端口号,像http协议默认的端口号是80。如果该网址采取默认的端口,就不必写明端口数字;如果该网址使用了非默认的端口,比如http服务搭建在8080端口之上,就必须在url中写明8080。
4、域名加上端口号,组成了url的授权部分,即网址的入口。
5、授权部分的右边包括斜杆在内、问号之前的一长串字符,表示具体的网络路径,犹如操作系统里面的文件目录。
6、问号之后、井号之前的部分,是以等号隔开的请求参数,各参数之间以“&”分隔,具体格式形如“参数a名称=a参数值&参数b名称=b参数值&参数c名称=c参数值”。请求参数中的参数值允许变化,网络服务将按照指定的数值返回相应的结果数据。
7、网络路径加上请求参数,组成了url的文件名称,有了文件名就能访问该url所表达的网络资源。
8、井号之后的字串为引用位置,假设一个网页很长很长,打开后默认显示网页的顶部,造成用户下拉网页找到某块区域有点麻烦。而引用位置先给各区域做个编号,然后在url末尾带上该位置的编号,于是网页打开后会自动滚到指定位置的区域,从而方便了用户的浏览操作。
搞清楚了url各段部分的作用,有助于后续的网络编程工作。就网址访问而言,java提供了同名的网址工具url,该工具类不偏不倚正好名叫url,其构造方法的输入参数即为网址字符串,此后的http访问操作皆有赖于url对象。url工具常用的方法包括但不限于下列几种:
getprotocol:获取url对象采用的网络协议。
gethost:获取url对象的域名(主机名称)。
getdefaultport:获取url对象的默认端口。http协议的默认端口号是80,ftp协议的默认端口号是21,https协议的默认端口号是443。
getport:获取url对象的指定端口(若不显式指定则返回-1)。
getauthority:获取url对象的授权部门(由域名和指定端口组成)。
getpath:获取url对象的路径(不包括域名)。
getquery:获取url对象的请求参数。
getfile:获取url对象的文件名(由路径和请求参数组成)。
getref:获取url对象的引用位置。
openconnection:打开url对象的网络连接,并返回urlconnection连接对象。无论是接口调用,还是上传下载,都依赖于这里的连接对象。

一个完整的网址字符串,包含了蛮多的地址信息,一个字符都错不得。自然程序员很关心网址到底有哪些校验办法,可以支持判断某个网址是合法请求还是非法请求。首先是域名的合法性校验,java提供了专门的网络地址工具inetaddress,调用该工具的静态方法getbyname,能够获得指定域名的网络地址对象,具体的方法调用代码示例如下:

			// 根据域名或ip获得对应的网络地址对象
			inetaddress inet = inetaddress.getbyname(host);

 

之后调用网络地址对象的以下方法,即可获取相应的网络地址信息:
gethostaddress:获取网络地址对象的ip地址。
gethostname:获取网络地址对象的域名。
isreachable:检查对方主机是否能连得上。但该方法不可靠,因为可能由于存在防火墙导致返回false。
可见尽管inetaddress提供了isreachable方法用于检测域名的连通性,但该方法并不总能奏效。那么退而求其次,只要校验域名的格式是否正确便行;这样的话,在调用getbyname方法之时,增加捕捉未知域名异常unknownhostexception;一旦捕捉到该异常,就认为当前域名是非法域名。此时域名的合法性校验代码变成了下面这样:

	// 测试域名的可用信息。返回true表示域名合法,返回false表示域名非法
	private static boolean testhost(string host) {
		try {
			// 根据域名或ip获得对应的网络地址对象
			inetaddress inet = inetaddress.getbyname(host);
		} catch (unknownhostexception e) { // 如果host字符串并非合法的域名/ip,则getbyname方法会扔出“未知的域名异常”
			e.printstacktrace();
			return false; // 返回false表示该字符串不是合法的域名/ip
		}
		return true; // 返回true表示该字符串是合法的域名/ip
	}

另一个值得注意的地方是请求参数中的参数值编码,显然url格式存在部分保留字符,包括冒号、斜杆、问号、井号等等,这些字符不应直接出现在query部分的参数值当中,故而需要对参数值里面的保留字符进行转义。常见字符对应的url转义符如下图所示:

Java开发笔记(一百零七)URL地址的组成格式
除了保留字符以外,中文字符一样需要转义,比如“你”要转为“%e4%bd%a0”。原始字符的转义过程也称作url编码,反过来则有反转义过程,即将转义后的字符恢复为原始字符,反转义过程也称作url解码。java同时提供了对应的url编码工具urlencoder,以及url解码工具urldecoder,其中url编码的方法调用示例如下:

		// 获得url编码后的转义字符串
		string encoded = urlencoder.encode(origin);

 

url解码的方法调用示例如下:

		// 获得url解码后的原始字符串
		string origin = urldecoder.decode(encoded);

 


更多java技术文章参见《java开发笔记(序)章节目录