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包含了网络地址的各项组成部分,具体细节如下图所示。

接下来对上图的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转义符如下图所示:

除了保留字符以外,中文字符一样需要转义,比如“你”要转为“%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开发笔记(一百零七)URL地址的组成格式相关推荐

  1. java swing对话框_Java开发笔记(一百三十五)Swing的文件对话框

    除了常规的提示对话框,还有一种对话框也很常见,它叫做文件对话框.文件对话框又分为两小类:打开文件的对话框.保存文件的对话框,但在Swing中它们都用类型JFileChooser来表达.下面是JFile ...

  2. java文本输入框_Java开发笔记(一百三十九)JavaFX的输入框

    循着Swing的旧例,JavaFX仍然提供了三种文本输入框,分别是单行输入框TextField.密码输入框PasswordField.多行输入框TextArea.这些输入框都由抽象类TextInput ...

  3. java swing输入框_Java开发笔记(一百二十九)Swing的输入框

    Swing的输入框仍然分成两类:单行输入框和多行输入框,但与AWT的同类控件相比,它们在若干细节上有所调整.首先说单行输入框,AWT的单行输入框名叫TextField,平时输入什么字符它便显示什么字符 ...

  4. java 流式_Java开发笔记(七十二)Java8新增的流式处理

    通过前面几篇文章的学习,大家应能掌握几种容器类型的常见用法,对于简单的增删改和遍历操作,各容器实例都提供了相应的处理方法,对于实际开发中频繁使用的清单List,还能利用Arrays工具的asList方 ...

  5. java runnable 启动_Java开发笔记(九十七)利用Runnable启动线程

    前面介绍了线程的基本用法,按理说足够一般的场合使用了,只是每次开辟新线程,都得单独定义专门的线程类,着实开销不小.注意到新线程内部真正需要开发者重写的仅有run方法,其实就是一段代码块,分线程启动之后 ...

  6. JAVA翻译官_Java开发笔记(三)Java帝国的特种官吏

    上一篇文章介绍了Java工程的帝国区划,末尾给出了一段Java代码例子,这个代码虽然勉强能看懂,但是有些细节令人不甚了了.比如说"// 参观朱雀台"为何能够直接跟在当前行后面?&q ...

  7. java 日历工具_Java开发笔记(四十二)日历工具的常见应用

    前面介绍了日历工具Calendar的基本用法,乍看起来Calendar与Date两个半斤八两,似乎没有多大区别,那又何苦庸人自扰鼓捣一个新玩意呢?显然这样小瞧了Calendar,其实它的作用大着呢,接 ...

  8. java 类型检查_Java开发笔记(五十二)对象的类型检查

    前面介绍了类的多态性,来自于鸡类的实例chicken,既能用来表达公鸡实例,也能用来表达母鸡实例.可是这导致了一个问题,假如在call方法内部需要手工判断输入参数属于公鸡实例还是母鸡实例,那该如何是好 ...

  9. java 文件缓冲区_Java开发笔记(八十六)通过缓冲区读写文件

    前面介绍了利用文件写入器和文件读取器来读写文件,因为FileWriter与FileReader读写的数据以字符为单位,所以这种读写文件的方式被称作"字符流I/O",其中字母I代表输 ...

  10. Android开发笔记(一百零七)统计分析SDK

    APP统计分析 用户画像 对程序员来说,用户画像就是用户的属性和行为:通俗地说,用户画像是包括了个人信息.兴趣爱好.日常行为等血肉丰满的客户实体.用户画像是精准营销的产物,企业通过收集用户的行为,然后 ...

最新文章

  1. hbase.client.keyvalue.maxsize的默认值
  2. php中public放什么,PHP中常用关键字public, private, protected, static...
  3. oracle中primary,oracle中如何 Primary key自增
  4. 点对点 客户端-服务器 聊天程序
  5. fanuc机器人四边形编程_中国工控 | FANUC 机器人码垛编程详解
  6. 类图的使用 c# 1613918428
  7. JSP和Servlet相同点和不同点?
  8. PCI的imagework已由freeview软件代替
  9. 一题多解(七)—— 取两数的最大值
  10. DeepStyle(第2部分):时尚GAN
  11. Java基础学习笔记:补充内容1 计算机字符编码
  12. deepin 20 推荐邮件客户端 Bluemail 邮箱
  13. mocha-在浏览器中运行
  14. 人人都是产品经理总结 第三章1
  15. android dialog 隐藏键盘,android dialog 隐藏虚拟按键
  16. 万字+图片解析计算机网络应用层
  17. 数量金融学(8):Markowitz均值-方差模型(2)
  18. 第一单元 用python学习微积分(五) 隐函数微分法和逆函数导数(上)- 隐函数微分
  19. java gif图片_java 如何生成动态的gif图片
  20. IT服务管理指标体系与报表体系

热门文章

  1. 4月10日 腾讯IEG 游戏研发 暑期实习 一面(记录)
  2. timing report 中 edge 理解
  3. PVT(Pyramid Vision Transformer)算法整理
  4. 关于回调函数与钩子函数
  5. 合力同行共促5G发展,九州云获颁中国联通“2022年度最佳合作伙伴”
  6. java软件缺陷跟踪管理系统
  7. 层叠 1. 比较内容层级重要性的三个方法 2. 通过选择器来比较层级(重要) 通过比较特殊性 应用场景: 3. 比较源次序 重置css样式的导入
  8. 计算机停电组态丢失,DCS正确停电与上电的操作规范
  9. 以假乱真,MIT基于深度学习的新算法给视频配音
  10. 关于网易土木在线变动的公告(转)