网络请求中的绝对路径与相对路径

零、前言

在html文档中,我们需要使用script标签来引入js文件,和使用ajax技术来向后端请求数据(使用xhr或fetch)。

上述两种操作,其实都需要向服务器发送网络请求,以便获取所需的资源或者数据。

而在代码中,路径可能会有以下两种写法:

写法一 复制代码
// .....
  <script src="./js/demo.js"></script>
  
  <script type="text/javascript">
    function queryData() {
      // 使用fetch发送网络请求,使用xhr也可
      fetch('./abc/xyz')
        .then(response => response.json()) // 读取 response body,并将其解析为 JSON 格式
        .then(res => {
          // ......
        })
    }
  </script>
// .....
写法二 复制代码
// .....
  <script src="/js/demo.js"></script>
  
  <script type="text/javascript">
      function queryData() {
        // 使用fetch发送网络请求,使用xhr也可
        fetch('/abc/xyz')
          .then(response => response.json()) // 读取 response body,并将其解析为 JSON 格式
          .then(res => {
            // ......
          })
      }
  </script>
// .....

上述两种方式都是正确的写法,第一种使用的是相对路径 的写法,第二种则是绝对路径 的写法。

此时它们都不是完整的url(协议+主机号+端口号+路径),而浏览器会根据代码写法的不同,采取不同的规则去拼接成完整的url,再向服务器发送请求。

一、绝对路径

上述/abc/xyz的写法只是绝对路的其中一种写法,事实上有以下三种写法

1.1 协议+主机名+端口号+路径

第一种方式其实就是完整的url写法:协议+主机名+端口号+路径

http://website:80/abc

这是一个完整的url地址(使用http协议时,80端口为默认端口,可以省略),不需要进行额外的拼接,可直接向目标资源发送请求。

一般会在访问网站外链时使用。

1.2 主机名+端口号+路径

第二种方式就是省略协议,只写主机名+端口号+路径(注意要以"//"作为开头)

//website:80/abc

上述写法相比一个完整的url,其实就是缺少了协议,浏览器在发送请求前,会使用当前页面url中的协议 来进行拼接,如当前页面的url使用的是http协议,那么就会拼接为http://website:80/abc再发送请求。

1.3路径

第三种写法就是只保留路径(注意是以"/"作为开头):

/abc

上述写法对比完整的url,缺少的是协议+主机名+端口号,此时url拼接逻辑和第二种写法一样,复用当前页面url的协议+主机名+端口号,成为一个完整的url后再发送请求。

1.4 总结及注意点

使用绝对路径的方式,拼接成完整url的逻辑,其实就是复用当前页面的url,缺啥补啥

可以省略协议 ,或省略协议+主机名+端口号 ,但是不可以省略协议+主机名(但保留端口号)

二、相对路径

2.1 理解路径

http://website:80/abc/xyz/target

如上所示是一个完整的url,个人认为可以将路径部分"abc/xyz/target"理解成是计算机中的文件的路径:

  • target就是这次请求我们的"最终目标"
  • xyz是target的"父文件夹"
  • abc是xyz的"父文件夹"
  • abc则存放在"根目录"中

在后续理解相对路径的拼接规则时,就理解成计算机中对于某个文件的相对路径就可以了。

相对路径的写法是不需要写协议、主机号、端口号的,只需要写路径部分 ,所以在拼接成完整url时,会复用当前网页的协议、主机号和端口号

后续例子中,会假设当前页面的url为http://website:80/abc/xyz/target

2.2 方式一

以"./"作为开头

./aa/bb

如上所示是相对路径的一种写法,它与计算机中的相对路径一致,表示"当前文件夹下的资源"

相对于网页当前url中的"/abc/xyz/target"而言,可以简单理解为"在xyz文件夹中的aa文件夹下的bb文件",也就是"/abc/xyz/aa/bb"了。

与网页当前url的协议、主机号、端口号拼接后的完整url为:http://website:80/abc/xyz/aa/bb

2.3 方式二

前缀为空(空字符串)

aa/bb

这种方式表示的意思和方式一的一模一样,代表的也是 "当前文件夹下的资源"

同理可得拼接后的完整url为:http://website:80/abc/xyz/aa/bb

2.4 方式三

2.4.1 常规情况

以"../"作为开头

../aa/bb

这种方式其实也和计算机中表示文件的相对路径的用法一样,表示的是 "上级文件夹中的资源"

对于/abc/xyz/target这个"文件结构"而言,需要找到xyz的上级目录,然后拼接上aa/bb。

拼接成完整的url为:http://website:80/abc/aa/bb

2.4.2 特殊情况

上述3.3.1中的"../"可以连续使用,如下所示

../../../../aa/bb

如上写法是合法的,如果当前页面的url层数足够多,则一层一层往上寻找,最后拼接上"aa/bb"即可。

但是对于我们的例子:http://website:80/abc/xyz/target而言,层数显然是不足够的。

但即使如此,浏览器在完善这个相对路径时,也不会报错,而是直接使用网站的根目录 来拼接aa/bb,完整url为:http://website:80/aa/bb

三、总结

以我个人理解,在项目中,绝对路径的使用频率会比相对路径高。

因为相对路径会受当前网页的url所影响,而现在较多网站是单页面应用,使用前端路由去改变url的路径部分,所以使用相对路径可靠性会较低。

而绝对路径则不受url中路径的影响,它只关注url中的协议、主机号、端口号,而即使网站使用的是前端路由,也不会对它们进行修改,所以更加可靠。

当然,对于项目而言,没有最好的技术,只有更适合的方案。具体方案的选择还应该结合项目需求及部署情况进行选择。

相关推荐
2分钟速写快排18 分钟前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60611 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角2 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!2 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰2 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi4 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen4 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马5 小时前
AI源码分析:拆解模型底层实现逻辑
前端
BillKu5 小时前
全局样式变量:CSS 自定义属性(--border-color)和SCSS 变量($border-color)的说明
javascript·css·scss
IT_陈寒5 小时前
React子组件莫名其妙重渲染?你可能漏了这个Hook
前端·人工智能·后端