URI是什么?

这篇具有很好参考价值的文章主要介绍了URI是什么?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

URL——统一资源定位符Uniform Resource Locator)

URI的格式

URI 本质上是一个字符串,这个字符串的作用是唯一地标记资源的位置或者名字

下面的这张图显示了 URI 最常用的形式,由 scheme、host:port、path 和 query 四个部分组成,但有的部分可以视情况省略。
URI是什么?
URI的基本组成

URI 第一个组成部分叫scheme,翻译成中文叫“方案名”或者“协议名”,表示资源应该使用哪种协议来访问。

最常见的当然就是“http”了,表示使用 HTTP 协议。另外还有“https”,表示使用经过加密、安全的 HTTPS 协议。此外还有其他不是很常见的 scheme,例如 ftp、

ldap、file、news 等。

浏览器或者你的应用程序看到 URI 里的 scheme,就知道下一步该怎么走了,会调用相应的 HTTP 或者 HTTPS 下层 API。显然,如果一个 URI 没有提供

scheme,即使后面的地址再完善,也是无法处理的。

在 scheme 之后,必须是三个特定的字符😕/”,它把 scheme 和后面的部分分离开。

在“😕/”之后,是被称为“authority”的部分,表示资源所在的主机名,通常的形式是“host:port”,即主机名加端口号。

主机名可以是 IP 地址或者域名的形式,必须要有,否则浏览器就会找不到服务器。但端口号有时可以省略,浏览器等客户端会依据 scheme 使用默认的端口号,

例如 HTTP 的默认端口号是 80,HTTPS 的默认端口号是 443。

有了协议名和主机地址、端口号,再加上后面标记资源所在位置path,浏览器就可以连接服务器访问资源了。

URI 里 path 采用了类似文件系统“目录”“路径”的表示方式,因为早期互联网上的计算机多是 UNIX 系统,所以采用了 UNIX 的“/”风格。其实也比较好理解,它与

scheme 后面的“😕/”是一致的。

这里我也要再次提醒你注意,URI 的 path 部分必须以“/”开始,也就是必须包含“/”,不要把“/”误认为属于前面 authority。

说了这么多“理论”,来看几个实例。

http://nginx.org

http://www.chrono.com:8080/11-1

https://tools.ietf.org/html/rfc7230

file:///D:/http_study/www/

第一个 URI 算是最简单的了,协议名是“http”,主机名是“nginx.org”,端口号省略,所以是默认的 80,而路径部分也被省略了,默认就是一个“/”,表示根目录。

第二个 URI 是在实验环境里这次课程的专用 URI,主机名是“www.chrono.com”,端口号是 8080,后面的路径是“/11-1”。

第三个是 HTTP 协议标准文档 RFC7230 的 URI,主机名是“tools.ietf.org”,路径是“/html/rfc7230”。

最后一个 URI 要注意了,它的协议名不是“http”,而是“file”,表示这是本地文件,而后面居然有三个斜杠,这是怎么回事?

如果你刚才仔细听了 scheme 的介绍就能明白,这三个斜杠里的前两个属于 URI 特殊分隔符“😕/”,然后后面的“/D:/http_study/www/”是路径,而中间的主机名

被“省略”了。这实际上是 file 类型 URI 的“特例”,它允许省略主机名,默认是本机 localhost。

但对于 HTTP 或 HTTPS 这样的网络通信协议,主机名是绝对不能省略的。原因之前也说了,会导致浏览器无法找到服务器。

URI的查询参数

使用“协议名 + 主机名 + 路径”的方式,已经可以精确定位网络上的任何资源了。但这还不够,很多时候我们还想在操作资源的时候附加一些额外的修饰参数。

举几个例子:获取商品图片,但想要一个 32×32 的缩略图版本;获取商品列表,但要按某种规则做分页和排序;跳转页面,但想要标记跳转前的原始页面。

仅用“协议名 + 主机名 + 路径”的方式是无法适应这些场景的,所以 URI 后面还有一个“query”部分,它在 path 之后,用一个“?”开始,但不包含“?”,表示对资源附

加的额外要求。这是个很形象的符号,比“😕/”要好的多,很明显地表示了“查询”的含义。

查询参数 query 有一套自己的格式,是多个“key=value”的字符串,这些 KV 值用字符“&”连接,浏览器和客户端都可以按照这个格式把长串的查询参数解析成可理

解的字典或关联数组形式。

你可以在实验环境里用 Chrome 试试下面这个加了 query 参数的 URI:

http://www.chrono.com:8080/11-1?uid=1234&name=mario&referer=xxx

为什么要对URI进行编码?

在 URI 里只能使用 ASCII 码,但如果要在 URI 里使用英语以外的汉语、日语等其他语言该怎么办呢?

还有,某些特殊的 URI,会在 path、query 里出现“@&?"等起界定符作用的字符,会导致 URI 解析错误,这时又该怎么办呢?

所以,URI 引入了编码机制,对于 ASCII 码以外的字符集和特殊字符做一个特殊的操作,把它们转换成与 URI 语义不冲突的形式。这在 RFC 规范里称

为“escape”和“unescape”,俗称“转义”。

URI 转义的规则有点“简单粗暴”,直接把非 ASCII 码或特殊字符转换成十六进制字节值,然后前面再加上一个“%”。

例如,空格被转义成“%20”,“?”被转义成“%3F”。而中文、日文等则通常使用 UTF-8 编码后再转义,例如“银河”会被转义成“%E9%93%B6%E6%B2%B3”。

有了这个编码规则后,URI 就更加完美了,可以支持任意的字符集用任何语言来标记资源。

  • 传递数据中,如果存在工作分隔符的保留字符怎么办?

  • 对可能产生歧义的数据编码

    • 不在ASCII 码范围内的字符
    • ASCII 码中不可显示的字符
    • URI中规定的保留字符
    • 不安全字符(传输 环节中可能会被不正确处理) ,如空格、引号、尖括号等

    示例:

    https://www.baidu.com/s?wd=?#!

    https://www.baidu.com/s?w=hello world

    https://www.baidu.com/s?wd=hello ’ > 时间文章来源地址https://www.toymoban.com/news/detail-401510.html

到了这里,关于URI是什么?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • netty websocket uri 连接时 传参

    在URL后面加上参数 new WebSocket(\\\"ws://127.0.0.1:20683/ws/serialPort?name=value\\\") 然后自己解析参数 在客户端设置 连接成功回调 ,一旦连接成功发送参数:

    2024年02月16日
    浏览(30)
  • Jmeter常见问题之URI异常

    这篇文章介绍一下\\\"http://\\\"重复导致的URI异常问题,通常从浏览器地址栏复制url,直接粘贴到Jmeter的http请求的服务器地址中会默认带上“http://”,要将http://删除,只写IP地址,如下图: 否则,在结果树中会抛出一个URI语法异常,如下图:              【下面是我整理的202

    2024年02月16日
    浏览(40)
  • [WPF]浅析资源引用(pack URI)

    WPF中我们引用资源时常常提到一个概念: pack URI ,这是WPF标识和引用资源最常见的方式,但不是唯一的方式。本文将介绍WPF中引用资源的几种方式,并回顾一下 pack URI 标识引用在不同位置的资源文件的写法。 WPF中使用URI标识和加载位于各种位置的文件,包括当前程序集资源

    2024年02月05日
    浏览(32)
  • js中三种URI编码方式比较

    数据传递常需要编码后传递,接收还需反编译,定义url: var url = \\\"https://www.cnblogs.com/?username=\\\'小森森\\\'password=\\\'666666\\\'\\\"; https%3A//www.cnblogs.com/%3Fusername%3D%27%u5C0F%u68EE%u68EE%27%26password%3D%27666666%27 https%3A%2F%2Fwww.cnblogs.com%2F%3Fusername%3D\\\'%E5%B0%8F%E6%A3%AE%E6%A3%AE\\\'%26password%3D\\\'666666\\\' https://www.cnblogs

    2024年02月04日
    浏览(34)
  • spring cloud gateway中配置uri

    gateway中配置uri配置有三种方式: websocket方式:uri: ws://localhost:9000 http方式: uri: http://localhost:8130/ lb注册中心配置方式(注册的服务名称): uri: lb://monitor-ms gateway的lb方式识别的服务名称命名规则:

    2024年02月12日
    浏览(32)
  • 搞懂 API ,API 中 URI 设计规范分享

    API(Application Programming Interface)是现代软件开发中的一项关键技术,它为不同应用程序间提供了数据和功能交互的标准化方式。而 URI(Uniform Resource Identifier)作为 API 中的重要部分,其规范和良好的设计对于 API 的可用性、可维护性和可扩展性至关重要。 URI 是一个字符串序列

    2024年02月03日
    浏览(37)
  • kotlin根据文件的filePath转化为uri

    使用File类来创建一个文件对象,然后通过FileProvider来获取文件的URI getFileUri函数接受一个Context对象和文件的路径filePath作为参数,然后使用File类创建文件对象,最后通过FileProvider.getUriForFile方法将文件转换为URI。 1. 在AndroidManifest.xml文件中配置了FileProvider。 AndroidManifest.xml文件

    2024年04月26日
    浏览(17)
  • springcloud gateway正确路由配置 uri找不到服务?

    引言 在集成nacos组件以及springcloudalibaba 的gateway时,出现正确配置,如下文配置,却在测试demo调用该服务的时候,无法路由到此服务,说是无效服务。经过查阅资料得知其命名不符合gateway的命名规范,因而无法识别。规范详情见下文。 gateway可以识别的nacos服务名,命名规范

    2024年01月19日
    浏览(35)
  • 【Android 11/12】 通过Uri获取绝对路径的方法

    原理:通过对不同的Uri进行辨别,提取ID, 需要 android.permission.MANAGE_EXTERNAL_STORAGE 权限 直接获取\\\"primary:\\\"后的路径即可,后面即是相对路径. 与下一个类似,获取ID后进入数据表中查找. 进入MediaStore.Files表中进行查询_data字段,旧版通过直接查询uri的方法获取_data已经无效. 下面

    2024年02月15日
    浏览(35)
  • URI、URL、URIBuilder、UriBuilder、UriComponentsBuilder说明及基本使用

    之前想过直接获取url通过拼接字符串的方式实现,但是这种只是暂时的,后续地址如果有变化或参数很多,去岂不是要拼接很长,由于这些等等原因,所以找了一些方法实现 URI全称是Uniform Resource Identifier,也就是统一资源标识符,它是一种采用特定的语法标识一个资源的字符

    2024年02月11日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包