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. .NET6接入Skywalking链路追踪完整流程

    一.Skywalking介绍 Skywalking是一款分布式链路追踪组件,什么是链路追踪? 随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务.互联网应用构建在不同的软 ...

  2. Python爬虫+数据可视化教学:分析猫咪交易数据

    猫猫这么可爱 不会有人不喜欢吧: 猫猫真的很可爱,和我女朋友一样可爱~你们可以和女朋友一起养一只可爱猫猫女朋友都有的吧?啊没有的话当我没说-咳咳网上的数据太多.太杂,而且我也不知道哪个网站的数据比较好 ...

  3. docker compose 部署 minio

    1.docker-compose.yaml 文件如下: version: '3' services: minio: image: minio/minio:latest # 原镜像`minio/mini ...

  4. Conversation Modeling on Reddit Using a Graph-Structured LSTM

    publish: Transactions of the Association for Computational Linguistics,2016 tasks:  predicting popul ...

  5. angr原理与实践(一)——原理

    ​ 1本文系原创,转载请说明出处 关注微信公众号 信安科研人,获取更多的原创安全资讯 ​ 编辑 网上已经有很多介绍angr的官方文档的博客,但是怎么去用angr做一次有意义且成就感满满的分析的教程很少 ...

  6. CF1612D X-Magic Pair

    题意: 给一个数对 \((a,b)\) ,每次可以进行操作 \((a,b) \to (|a-b|,b)\) 或 \((a,b) \to (a,∣a−b∣)\),问最后能否令 \(a=x\) 或 \(b ...

  7. python 常用的魔法函数

    简介 在实际项目中,我们其实并不会太多的使用魔法函数,但是一些方法或者函数均是有魔法函数演变而来的,且在一些面试过程中会遇到一些关于常见方法的实现,就会牵扯到相应的魔法函数,此处将介绍一些我认为比较常 ...

  8. 智慧文旅IOC大数据可视化建设方案

    一.建设背景 自2020年以来,疫情对各行各业的都造成了不同程度的影响,对依赖人口消费实现商业价值的文旅行业更是受到了更大的冲击,因此在疫情当下以及科技发达的今天,如何利用科技的手段赋能文旅行业进行数 ...

  9. 运维实践-最新Nginx二进制构建编译lua-nginx-module动态链接Lua脚本访问Redis数据库读取静态资源隐式展现

    关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 0x0n 前言 ...

  10. 多云部署多主模式的MGR集群,每个云一个MGR 节点,满足业务单元化改造的需求

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 本 ...