• URI 、URL 和 URN


    URI

    URI 是 Uniform Resource Identifier 的缩写。

    Uniform

    • 统一不同类型的资源。比如 txtmp3jpeg 等不同的类型的资源都可以使用 URI 来标识
    • 统一不同协议。比如 httpftpmailto 等不同的协议都可以使用 URI 来标识
    • 统一新旧资源。引入新资源不会影响已有资源

    Resource

    官方定义没有对资源的范围做任何限制,所以任何被 URI 标识的东西都可以叫做资源。

    常见的例子有电子文档、图片、固定用途的信息(比如今天 Los Angeles 的天气预报)、一项服务(比如 HTTP-to-SMS 网关)或者是一组资源。一个资源不一定需要能通过互联网访问,比如一个组织和图书馆中的一些书也可以是资源。抽象的概念也可以是资源,比如某些关系(比如雇佣关系或者婚姻关系)。

    Identifier

    从其他资源中区分一个资源,无论用什么手段实现(比如名称、地址)。标识符可以是 ID,但也可以不是,所以不要将标识符与 ID 等价。

    语法规则

    由 协议、authority、path、query 和 fragment 组成

    URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
    
    hier-part   = "//" authority path-abempty
                      / path-absolute
                      / path-rootless
                      / path-empty
    

    协议必填且不能为空,路径必填但可以为空。Authority 不是必填,但如果填写了要以 // 开头。

    abempty 的意思是 absolute or empty

    两个示例:

    foo://example.com:8042/over/there?name=ferret#nose
     \_/   \______________/\_________/ \_________/ \__/
      |           |            |            |        |
    协议     authority       path        query   fragment
      |   _____________________|__
     /  /                        
     urn:example:animal:ferret:nose
    

    协议

    为了 robustness,协议是大小写不敏感的(比如 HTTPhttp 是一样的),但为了一致性,只应该使用小写来表示协议。常用的有:http、https、ftp、mailto、file、data 和 irc。

    Authority

    很多 URI 协议都包含一个用于命名 authority 的分级元素,所以 URI 的路径会指向 authority 对应的命名空间。

    Authority 以 // 开头,以下一个 /?# 或者 URI 的结尾而结尾。

    语法如下:

    authority   = [ userinfo "@" ] host [ ":" port ]
    

    这里不描述 userinfo,因为很少用到。

    host 语法如下:

    host        = IP-literal / IPv4address / reg-name
    

    host 同样是大小写不敏感,但为了一致性也要使用小写表示。

    • IP-literal:使用 IPV6 以及之后版本的 IP 地址,要使用 [] 包裹

    • IPv4address:使用点分十进制表示

        IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
      
      dec-octet   = DIGIT                 ; 0-9
                  / %x31-39 DIGIT         ; 10-99
                  / "1" 2DIGIT            ; 100-199
                  / "2" %x30-34 DIGIT     ; 200-249
                  / "25" %x30-35          ; 250-255
      
    • reg-name:点分字符串,字符串可以是字母或者 -

    可以看出 IPv4address 和 reg-name 并没有很明显的区分。所以为了区分这两者,采用 "first-match-wins" 算法:如果 host 匹配 IPv4address的规则,那它是一个 IPv4address 而不是 reg-name。

    路径采用与文件系统一样的路径表示方式,以 / 分割。设计者这样说:

    The relative URI syntax is just unix pathname syntax reused without apology.[2]

    PS:设计者后悔采用 // 的设计,因为这个太笨拙了[2],从使用情况就可以看出,一般我们都不会用到 // 而是直接输入 // 后面的部分(比如输入 www.google.com 而不是 //www.google.com)。

    URI、URL 和 URN

    "Uniform Resource Locator" (URL) 是 URIs 的一个子集,提供一种定位资源而不是标识资源的方法。"Uniform Resource Name" (URN) 被用来指 "urn" 协议的 URIs 和其他通过名称属性定位的 URIs[1, 3]。

    PS:关于 URL 的疑惑:上面说 URL 是定位而不是标识,但是 URI 中的 Identifier 就是标识符的意思,这不矛盾吗?

    人们实际使用中也没有很明显的区分 URI 和 URL。普通用户都是说 URL,程序员混用 URL 和 URI,甚至连 RFC 中也是混用这两者(比如 "URI Syntax" (RFC 2396)、"Registration Procedures for URL Schemes" (RFC 2717))。

    所以,综合各种情况,可以这样使用:

    • 如果资源会同时用 URL 和 URN 表示,那么使用 URI
    • 如果资源只用 URN 表示,那么用 URN,因为 URN 特殊并且少见
    • 如果资源只用 URL 表示,那么可以用 URL 或 URI,但是确定后最好统一使用而不是混用这两者

    参考

    1. rfc3986
    2. https://www.w3.org/People/Berners-Lee/FAQ.html#etc
    3. https://tools.ietf.org/html/rfc3305
  • 相关阅读:
    从头开始搭建分布式日志平台的docker环境
    spring mvc+ELK从头开始搭建日志平台
    两个与spring事务相关的问题
    shiro realm 注解失败问题解决过程
    如何解决CRUD操作中与业务无关的字段赋值
    通过angularjs的directive以及service来实现的列表页加载排序分页
    项目中应用eventbus解决的问题
    统一配置中心
    java枚举与.net中的枚举区别
    列表页的动态条件搜索
  • 原文地址:https://www.cnblogs.com/jay54520/p/9150294.html
Copyright © 2020-2023  润新知