URL中的参数,怎样用才算规范?

3,042 阅读2分钟

经常听到native的同学在吐槽,h5页面url的参数很不规范,有些在 '#' 前面,有些在 '#' 后面,导致经常出现参数丢失的现象。那到底url中的参数应该放在哪里呢,今天这篇文章就讨论一下这个问题。

’#‘ 是什么?

既然讨论的是url中的参数应该放在 '#' 的前面还是后面,我们就先讨论一下 '#' 是什么,有什么作用。

历史上,‘#’ 代表网页中的一个位置。其右面的字符,就是该位置的标识符。比如:

www.example.com/index.html#…

就代表网页index.html的print位置。如果页面中设置 ,浏览器读取这个URL后,会自动将print位置滚动至可视区域。

除此之外,

  1. http请求不会包含‘#’后面的内容
  2. ‘#’后面的内容发生变化浏览器不会重新加载页面
  3. ‘#’后面的内容发生变化会改变浏览器的浏览历史

了解了‘#’的作用和特点,我们来讨论一下,究竟参数放在 ‘#’前面 还是放在 ‘#’后面才算标准

URL参数标准

经过一段时间的查找,找到了这个,看起来有点靠谱了。

其中:RFC 2397RFC 3986看起来更像我们要找的内容(图中使用了URL和URI两个名词,这两个名词的区别参考这里)。果然我们在RFC 3986中找到了我们期望的内容:

其中3.4节讲到:query就可以理解我们放在 ‘#’前面的参数,以 '?' 开头以 ‘#’结尾,以"key=value"对的形式出现。用来和url schema, path等一起标识特定的资源。

3.5节讲到:3.4节中的query用于识别主要资源,而#后的内容用于识别次要资源(主要资源的一部分,或子集,如锚点所指向的网页片段),这部分内容以‘#’开头,到url的结尾结束。主要用于定位客户端的资源(对应于query:用来定位服务端的资源)。

因此大体可以得出结论:‘#‘前面的参数主要用于给服务端传参数, ’#‘后面的参数,主要是前端自己用。那前端自己用的参数放在 ’#‘前面 可以么?如果可以的话,这样就保持所有参数一致了,native的同学就不用关心 ‘#’后面的参数了,这样就可以避免很多麻烦事。具体可不可以这么做,我觉得可能需要关注以下几个问题:

  1. 参数变化需要重新发起请求,重新走一遍加载html,js,css的逻辑,能否接受这样的开销

  2. 通过html5 history.push进行页面跳转过程中参数始终保持在url中,这是否符合业务逻辑

  3. react-router, vue-router等跳转页面传递参数可能不那么好用了

参考文献:

1.www.ruanyifeng.com/blog/2011/0…

2.datatracker.ietf.org/doc/html/rf…

3.developer.mozilla.org/zh-CN/docs/…