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

零、前言

在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中的协议、主机号、端口号,而即使网站使用的是前端路由,也不会对它们进行修改,所以更加可靠。

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

相关推荐
浮华似水22 分钟前
简洁之道 - React Hook Form
前端
正小安2 小时前
如何在微信小程序中实现分包加载和预下载
前端·微信小程序·小程序
_.Switch4 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
一路向前的月光4 小时前
Vue2中的监听和计算属性的区别
前端·javascript·vue.js
长路 ㅤ   4 小时前
vite学习教程06、vite.config.js配置
前端·vite配置·端口设置·本地开发
长路 ㅤ   4 小时前
vue-live2d看板娘集成方案设计使用教程
前端·javascript·vue.js·live2d
Fan_web4 小时前
jQuery——事件委托
开发语言·前端·javascript·css·jquery
安冬的码畜日常4 小时前
【CSS in Depth 2 精译_044】第七章 响应式设计概述
前端·css·css3·html5·响应式设计·响应式
莹雨潇潇5 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
Jiaberrr5 小时前
Element UI教程:如何将Radio单选框的圆框改为方框
前端·javascript·vue.js·ui·elementui