java的URI和URL到底是什么

在我们做开发时,经常有URI和URL弄混的问题,如果当时直接看URI和URL的源码就不可能弄混。首先我总结一下URI和URL的关系:他们的关系是:URL是一种特殊的URI,是URI包括URL,

下面用公式的形式说明URI到底是什么?

URI=[scheme:][#fragment] 这正好可以用URI类中的getScheme getSchemeSpecificPart 以及getFragment得到.

在scheme为null时,这个URI被称为相对的URI。 在scheme不为空时URI称为绝对的URI

而=[//authority][:query]

在path为空时称为不透明的URI,在不为空时称为透明的URI

authority 又可以分为:[userinfo@][:port]

从这个公式我们可以看到URI确实包括URL。

下面写一个示例代码

package com.timo;

import java.net.URI;

public class URITest {
public static void main(String[] args) throws Exception{
//创建一个uri,根据[scheme:]<scheme-specific-part>[#fragment]
URI uri = new URI("http", "//qinlin@localhost:8080/oi/oi?user='aieg'", "iewio");
System.out.println(uri);
System.out.println(uri.getPath());
}
}

调试代码的图片如下,从下图可以看到上述公式的各个值是什么。

URI

URI的语法构成是:一个模式和一个模式特定部分。

表示形式如下:

模式:模式特定部分

scheme:scheme specific part



注意:模式特定部分的表示形式取决于所使用的模式。URI当前的常用模式包括:

  • data:链接中直接包含经过BASE64编码的数据。
  • file:本地磁盘上的文件。
  • ftp:FTP服务器。
  • http:使用超文本传输协议。
  • mailto:电子邮件的地址。
  • magnet:可以通过对等网络(端对端P2P,如BitTorrent)下载的资源。
  • telnet:基于Telnet的服务的连接。
  • urn:统一资源名(Uniform Resource Name)。

除此之外,Java中还大量使用了一些非标准的定制模式,如rmi、jar、jndi、doc、jdbc等,这些非标准的模式分别用于实现各种不同的用途。

URI中的模式特定部分没有固定的语法,不过,很多时候都是采用一种层次结构形式,如:

//授权机构/路径?查询参数

//authority/path?query



URI的authority部分指定了负责解析该URI其他部分的授权机构(authority),很多时候,URI都是使用Internet主机作为授权机构。例如http://www.baidu.com/s?ie=utf-8,授权机构是www.baidu.com(在URL角度来看,主机名是www.baidu.com)。

URI的路径(path)是授权机构用来确定所标识资源的字符串。不同的授权机构可能会把相同的路径解析后指向不同的资源。其实这一点很明显,试下你写两个不同的项目,主页的路径都是/index.html,它们一定是完全相同的html文档。另外,路径是可以分层的,分层的各个部分使用斜线"/"进行分隔,而"."和".."操作符用于在分层层次结构中的导航(后面这两个操作符可能很少见到,了解即可)。

URL

URL全称是Uniform Resource Location,也就是统一资源位置。实际上,URL就是一种特殊的URI,它除了标识一个资源,还会为资源提供一个特定的网络位置,客户端可以通过它来获取URL对应的资源。

URL所表示的网络资源位置通常包括用于访问服务器的协议(如http、ftp等)、服务器的主机名或者IP地址、以及资源文件在该服务器上的路径。典型的URL例如http://localhost/myProject/index.html,它指示本地服务器的myProject目录下有一个名为index.html的文档,这个文档可以通过http协议访问(实际上,URL不一定是指服务器中的真实的物理路径,因为我们一般在服务器中部署应用,如Servlet应用,URL访问的很可能是应用的接口,至于最终映射到什么资源可以由应用自身决定)。

URL的语法

URL的语法表示形式为:

protocol://userInfo@host:port/path?query#fragment

协议://用户信息@主机名:端口/路径?查询#片段

  • protocol:URL中的协议(protocol)是相应于URI中的模式(schema)的另一个叫法。URL中,协议部分可以是file、ftp、http、https、magnet、telnet或者其他定制协议字符串(但是不包括urn)。
  • userInfo:URL中的用户信息(userInfo)是服务器的登录信息,这部分信息是可选的。如果这部分信息存在,一般会包含一个用户名,极少情况下会包含一个口令。实际上URL携带用户信息是不安全的。
  • port:URL中的端口号(port)是指服务器中应用的运行端口,默认端口为80,此部分信息是可选的(也就如果不指定端口号就使用默认端口80)。
  • path:URL中的路径(path)用于表示服务器上的一个特定的目录(其实说一个特定的文件也可以),这个特定的目录不一定是物理目录,也有可能是逻辑目录。这一点很容易说明,一般不可能把服务器上面的目录直接公开让所有人访问,服务器上面跑的一般是Web(Java的话一般是Servlet)应用,路径指向的实际数据来源甚至很大可能是在其他服务器上的MySQL中的查询结果。
  • query:查询参数(query)一般是一个字符串,它表示URL中向服务器提供的附加参数,一般只使用在http协议的URL中,其中包含了表单数据,来源于用户的输入,表示形式是key1=value1&key2=value2&keyn=valuen。
  • fragment:片段(fragment)表示远程服务器资源的某个特定的部分。假如服务器资源是一个HTML文档,此片段标识符将制定为该HTML文档的一个锚(Anchor)。如果远程资源是一个XML文档,那么这个片段标识符是一个XPointer。

相对URL

URL可以告知浏览器一个文档(Document,假设URL对应服务器上的资源统一叫做文档)的大量信息:获取文档所使用的协议、文档所在的主机、文档在该主机中的路径等。文档中可能也存在引用和当前URL相同的URL,因此,在该文档中使用URL的时候并不要求完整地指定每一个URL,URL可以继承其父文档的协议、主机名和路径。继承了父文档URL的部分信息的这类不完整的URL称为相对URL(Reletive URL),相反,完整指定所有部分的URL称为绝对URL(Absolute URL)。在相对URL中,缺少的各个部分与请求该文档的URL对应的部分相同。举个例子,我们访问本地服务器的一个HTML文档,URL为http://localhost:8080/myProject/index.html,index.html文档中存在一个超链接<a. href="login.html">,当我们点击此超链接的时候,浏览器会从原始URL(http://localhost:8080/myProject/index.html)中截去index.html然后拼接login.html,最后访问http://localhost:8080/myProject/login.html。

如果相对URL以"/"开头,那么它是相对于文档的根目录,而不是当前的文档。举个例子,我们访问本地服务器的一个HTML文档,URL为http://localhost:8080/myProject/index.html,index.html文档中存在一个超链接<a. href="/login.html">,当我们点击此超链接的时候,浏览器会跳转到http://localhost:8080/login.html。

相对URL有两个显著的优点:

  1. 减少文档编写量,毕竟可以省略一部分URL内容,不过这个不是重要的优点。
  2. 重要的优点是:相对URL允许使用多协议来提供一个文档树,例如http和ftp,使用相对URL编写的文档可以从一个网站直接复制或者迁移到另一个网站而不会破坏文档内部URL链接。

java的URI和URL的关系的更多相关文章

  1. java的URI和URL到底是什么

    在我们做开发时,经常有URI和URL弄混的问题,如果当时直接看URI和URL的源码就不可能弄混.首先我总结一下URI和URL的关系:他们的关系是:URL是一种特殊的URI,是URI包括URL, 下面用 ...

  2. URI和URL的关系与区别

    首先给大家举个例子,有一家公司的总经理,某天,给了我一张名片,上面写了他的头衔,北京XXX公司总经理 张三,还有他的办公室地址,北京市海淀区长安街35号北京XXX公司总经理办公室,那么,我以后给我的朋 ...

  3. URI,url简介

    URI,URL是什么? URI :Uniform Resource Identifier,统一资源标识符: URL:Uniform Resource Locator,统一资源定位符: URN:Unif ...

  4. Java魔法堂:URI、URL(含URL Protocol Handler)和URN

    一.前言 过去一直搞不清什么是URI什么是URL,现在是时候好好弄清楚它们了!本文作为学习笔记,以便日后查询,若有纰漏请大家指正! 二.从URI说起    1. 概念 URI(Uniform Reso ...

  5. java网络---再论URL & URI

    关于URL 和URI的关系,在本系列的第二篇:java网络---基本web概念 中已经简述了. 这里重复一点,就是URI包含URL,或者说URI是父类,URL就是子类的概念. 本篇再来详述这2个概念. ...

  6. Java网络编程之URL和URI

    Java网络编程之URL与URI 一.URL与URI简介 URI = Universal Resource Identifier 统一资源标志符 URL = Universal Resource Lo ...

  7. Java网络编程-URI和URL

    前提 前面的一篇文章<Java中的Internet查询>分析完了如何通过IP地址或者主机名确定主机在因特网中的地址.任意给定主机上可能会有任意多个资源,这些资源需要有标识符方便主机之间访问 ...

  8. java URI 与URL问题

    File类存在两个看起来很相似的方法toURI()和toURL(),这两个方法都是将文件转换成一个链接,可以网络访问.只是URI和URL的应用范围不同,URI来的更广. 那么为什么要使用toURI() ...

  9. URI与URL详解

    URL 与 URI 很多人会混淆这两个名词. URL:(Uniform/Universal Resource Locator 的缩写,统一资源定位符). URI:(Uniform Resource I ...

随机推荐

  1. 工具箱之 IKVM.NET 项目新进展

    在各种群里经常讨论的一个事情是.NET 如何调用 Java 的实现,最常见的场景之一就是在加解密方面Java提供的密钥,C#无法解密, C#中byte范围是[0,255],而Java中的byte范围是 ...

  2. Java 向数组中添加元素

    一般数组是不能添加元素的,因为他们在初始化时就已定好长度了,不能改变长度. 向数组中添加元素思路 第一步:把数组转化为集合 list = Arrays.asList(array); 第二步:向集合中添 ...

  3. Linux for CentOS 下的 nginx 绿色安装-超省心安装

    1.我这里是nginx-1.13.0-1.x86_64 .rpm(点击下载)版本的. 2.安装nginx的相应环境.有些环境可能不必须,但是安装了,确保以防万一,多多益善 yum install gd ...

  4. S32Kxxx bootloader之UDS bootloader

    了解更多关于bootloader 的C语言实现,请加我Q扣: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 两周前完成了基于UDS ...

  5. 记一次 .NET 某新能源系统 线程疯涨 分析

    一:背景 1. 讲故事 前段时间收到一个朋友的求助,说他的程序线程数疯涨,寻求如何解决. 等我分析完之后,我觉得这个问题很有代表性,所以拿出来和大家分享下,还是上老工具 WinDbg. 二: WinD ...

  6. 从入门到爱上Git

    时间不在于你拥有多少,而在于你怎样使用------时之沙 · 艾克 一.Git设置 1.1 Git全局设置 当我们安装好Git以后,我们需要对Git进行账号.邮箱的设置 设置用户信息 git conf ...

  7. 从零开始搭建Vue2.0项目(一)之快速开始

    从零开始搭建Vue2.0项目(一)之项目快速开始 前言 该样板适用于大型,严肃的项目,并假定您对Webpack和有所了解vue-loader.确保还阅读vue-loader的文档,了解常见的工作流程配 ...

  8. 通过类名引用静态成员方法和通过super引用父类的成员方法

    package com.yang.Test.StaticMethodReference; /** * 通过类型引用静态成员方法 * 类已经存在,静态成员方法也已经存在 * 就可以通过类名直接引用静态成 ...

  9. Windows 安装 Linux 环境

    简介 在实际开发中,我们除了在Windows上进行开发外,可能还需要基于Linux进行一些编译或者测试等,因此,我们可能需要在Windows环境中安装Linux环境,通常可能我们会使用虚拟机替代,但是 ...

  10. python 日志类

    简介 在所有项目中必不可少的一定是日志记录系统,python为我们提供了一个比较方便的日志模块logging,通常,我们都会基于此模块编写一个日志记录类,方便将项目中的日志记录到文件中. loggin ...