zoukankan      html  css  js  c++  java
  • http协议进阶(二)URL与资源

    一、URL的语法 

    URL是互联网资源的标准化名称

    URL提供了一种定位互联网上任意资源的手段,但这些资源要通过不同方案(协议:比如http、ftp、smtp)来访问,因此URL语法会略有差异

    大部分URL都遵循通用的语法,而且不同URL方案风格和语法都有重叠

    大多数URL协的语法都建立在下面9个部分构成的通用格式上:

    <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

    其中最重要的3个部分是:方案(scheme)、主机(host)和路径(path)

    通用URL组件:

     

    1、方案-使用什么协议

    方案:实际上规定了如何访问指定资源的主要标识符,它告诉负责解析URL的应用程序应该是用什么协议

    方案组件必须以一个字母符号开始,由第一个“:”符号将其与URL其余部分分隔开来。(方案名大小写不敏感)

     

    2、主机与端口

    想要在往上寻找到资源,应用程序需要知道哪台机器装载了资源,以及在机器的什么地方可以找到对目标资源进行访问的服务器,URL的主机和端口提供这2点信息

    主机组件标识了往上能访问资源的宿主机器。可用主机名或者IP地址来表示主机名。比如下面2个URL就是指向同一个资源

    主机名指向:http://joes-hardware.com:80/index.html

    IP指向:161.58.228.45:80/index.html

    端口组件标识了服务器正在监听的网络端口。对下层使用TCP协议的http协议来说,默认端口为80

     

    3、用户名和密码

    有些服务器都要求输入用户名和密码才允许用户访问数据,比如FTP(文件传输协议),如下面几个例子

    ftp://ftp.prep.ai.mit.edu/pub/gnu

    没有用户名和密码,只有标准的协议、主机和路径;如果某个应用程序使用的URL协议要求输入用户名密码,但用户没有提供,通常会插入一个默认的用户名和密码,比如FTP

    ftp://anonymous@ftp://ftp.prep.ai.mit.edu/pub/gnu

    指定了一个用户名anonymous,与主机组合在一起,看起来像一个email地址一样;字符“@”将用户名和密码组件与其他部分分隔开来

    ftp://anonymous:my_password@ftp://ftp.prep.ai.mit.edu/pub/gnu

    指定了用户名和密码,两者之间由字符“:”隔开

     

    4、路径

    路径说明了请求的资源位于服务器的什么地方,通常是一个分级的文件系统路径;比如:

    http://joes-hardware.com:80/seasona/index-fall.html

    这个URL中的资源路径就是seasona/index-fall.html,很像Unix文件系统中的文件系统路径

    路径是服务器定位资源所需的信息,可以用“/”将http URL中的路径组件划分为一些路径段(path segment),每个路径段都有自己的参数字段

     

    5、参数

    对很多协议来说,只有简单的主机名和到达对象路径的是不够的,除了端口和用户名密码,还需要更多的内容才可以访问

    有些负责解析URL的应用程序需要协议参数才能工作;否则服务器不会提供服务,或者提供错误的服务,比如

    ftp协议有两种传输方式:二进制和文本。如果用文本形式传送二进制图片,结果很难预料有多糟糕

    参数组件是URL中的名值队列表,由“/”将其与其他部分分隔开,比如

    ftp://ftp.prep.ai.mit.edu/pub/gnu;type=d      

    参数为type=d,其中参数名为type,值为d

     

    6、查询字符串

    在我们发送请求时,很多的资源,比如数据库服务,都可以通过查询来缩小请求资源的类型范围,例如

    http://www.joes-hardware.com/inventoty-check.cgi?itcm-12731

    问号(?)右边的内容就是这个URL的查询组件。URL的查询组件和标识网关资源的URL路径组件一起被发送给网关资源。可以将网关当做访问其他应用程序的访问点

    如下图:查询目的是检查清单中是否size为large、color为blue的条目

    网关基本都是希望查询字符串以一系列“名/值”对的形式出现,名值对之间用“&”分隔

    上面的例子,查询组件有2个名/值对:item=12731和color=blue

     

    7、片段

    有些资源类型,比如HTML,除了资源级意外,还可以进一步划分,比如一个带有章节的大型文本文档,资源的URL会指向整个文档,但理想情况,可以指向资源中的章节

    为了方便引用,URL允许使用片段(frag)组件来表示资源内的一个片段,片段挂在URL右边,最前面有一个字符“#”,比如:

    http://www.joes-hardware.comtools.html#drills

    这个例子中,片段引用了joes-hardwareweb服务器上页面/tools.html中的一个部分,这部分名字叫drills

    服务器处理的是整个对象,URL片段仅由客户端使用并展示

     

    二、URL快捷方式

    web可以理解并使用URL的快捷方式,比如缩略,自动扩展(用户输入关键部分,浏览器负责填充)

     

    1、相对URL

    URL有2种方式:绝对的和相对的。目前为止,我们使用的URL基本都是绝对的,它包含了访问资源所需的全部信息

    相对URL是不完整的,要从相对URL中获取访问资源的全部信息,就必须相对于另一个基础(base)的URL进行解析

    相对URL是URL的一种便捷缩略记法,下面是一个嵌入了相对URL的HTML文档实例

    <html>
    <head><title>joe's tools</title></head>
    <body>
    <h1>tools page</h1>
    <h2>hammers<h2>
    <p>joe's hardware online has the largest selection of<a herp="./
    hammers.html">hammers
    <a/>on earth
    </body>
    </html>

    上面的例子是资源http://www.joes-hardware.com/tools.html的HTML文档,在这个文档中包含了URL./hammers.html的超链接

    虽然看起来不完整,但实际上是合法的相对URL,这个URL可以相对于它所在的文档中的URL对其进行解释

    使用缩略形式的相对URL语法,写HTML时就可以省略URL中的方案、主机和其他一些组件,这些组件可以从所属资源的基础URL中推导出来,其他资源的URL也可以用这种缩略形式来表示

    下图说明了如何从基础URL中推导出缺失的组件信息

    相对URL只是URL的片段或一小部分,处理URL的应用程序需要在相对和决定URL之间进行转换

    PS:相对URL为了保持一组资源(HTML页面)的便捷性提供了一种便捷方式,如果使用相对URL,可以在搬移一组文档时,仍保持链接的有效性;

        因为相对URL是相对于新基础进行解释的,类似于在其他服务器提供镜像内容等功能

     

    1.1 基础URL

    基础URL是作为相对URL的参考点来使用的,可以来自以下不同的地方:

    在资源中显式提供:有些资源会显式指定基础URL

    比如:HTML文档中可能会包含一个定义了基础URL的HTML标记<BASE>,通过它来转换HTML文档中的所有相对URL

    封装资源的基础URL:如果在一个没有显式指定基础URL的资源中发现一个相对URL,如上面的HTML文档所示,可将其所属资源的URL作为基础

    没有基础URL:某些情况没有基础URL,一般意味着你有一个相对URL,但有时可能只是一个不完整或者损坏的URL

     

    1.2 解析相对引用

    解析:要将相对URL转换为一个决定URL,需要将相对URL和决定URL划分成组件段,这样,实际上只是在解析URL,但这种做法会将其划分为一个个组件,可以称之为解析/分解URL

    将基础和相对URL划分成组件,可以下用下图的算法来完成转换

    这个算法将一个相对URL转换成了其绝对模式,之后,就可以用其引用资源

     

    2、自动扩展URL

    很多浏览器会在用户提交URL/输入URL时尝试自动扩展URL,这样为用户提供便捷,用户不需要输入完整的URL,浏览器自动扩展

    自动扩展特性有以下2种方式:

    2.1 主机名扩展

    只要有些小提示,浏览器就可以帮你将输入的主机名扩展为完整的主机名,比如:输入baidu,构建出www.baidu.com;弊端在于有时候会为其他http应用程序带来问题,比如代理,后面详细解释

    2.2 历史扩展

    将以前用户访问过的URL记录储存起来,当用户输入URL时将其与历史记录中的URL前缀进行匹配,并提供一些完整的选项供用户选择

    PS:与代理一起使用时,URL自动扩展的行为可能有所不同,后面详细解释

     

    三、URL字符集

    URL是可移植的:它命名了互联网上所有的资源,需要通过各种不同协议来传输资源,资源在传输时采取了不同的机制,因此,信息的安全传输就很重要

    安全传输意味着URL传输不能丢失信息,但有些协议,比如SMTP(简单邮件传输协议),传输方法就是剥去一些特点的字符

    URL是可读的:因此,即使不可见、不可打印的字符能穿过邮件程序,从而成为可移植的,也不能在URL中使用

    URL是完整的:有人希望URL中包含初通用的安全字母表之外的二进制数据或字符,因此需要一种转义机制,将不安全的字符编码为安全字符再传输

     

    1、URL字符集

    1.1 很多计算机应用程序使用的都是ASCII字符集,ASCII使用7位二进制码来表示大多数按键和少数不可控字符,其移植性也很好,但考虑到全球用户太多,以及有时候URL中会包含任意二进制数据

    就需要将转义序列集成进来,通过转义序列将ASCII字符集的有限子集对任意字符值或数据进行编码,这样就实现了可移植和完整性

    1.2 编码机制

    为了避开安全字符集带来的限制,人们设计了“转义”表示法来表示不安全字符,其中包含一个百分号(%),后面跟2个表示字符ASCII码的十六进制数,下面是几个例子

    1.3 字符限制

    URL中,有几个字符被保留起来,有着特殊含义。有些字符不在定义的ASCII字符集中,还有些字符会和某些协议网关产生混淆,因此不赞成使用

     

    四、常见协议

    下面附录一个关于常用常见的协议列表

     

    五、URL未来发展

    URL可用来命名所有现存对象,其还提供一种可在各种协议间共享的统一命名机制,但并不完美;因为URL只表示实际地址,而不是准确的名字,意味着如果资源地址有变化,URL就无法对其进行定位

    永久统一资源定位符(PURL),其本质是搜索资源过程中引入一个中间层,通过一个中间资源定位符(resource locator)服务器对资源的实际URL进行登记和追踪

    客户端可以向定位符请求一个永久的URL,定位符可以以一个资源为响应,将客户端重定向到资源当前的URL去

     

  • 相关阅读:
    javaWeb应用 ssm架构 三方外卖系统
    字节跳动2017秋招-前端工程师
    原码补码反码
    MVVM设计模式
    初始化 react 项目
    antd-mobile定制主题
    jeecg-boot 在线代码生成记
    jeecg-boot 开源代码 问题记录
    idea 导入maven 项目一点反应没有,无识别
    layui 搜索加动态添加列
  • 原文地址:https://www.cnblogs.com/imyalost/p/5850127.html
Copyright © 2011-2022 走看看