什么是路由?router和route的区别在哪里?-最资讯
1. 什么是路由
(资料图片仅供参考)
在Web开发过程中,经常会遇到『路由』的概念。那么,到底什么是路由?简单来说,路由就是URL到函数的映射。
2. router和route的区别
route就是一条路由,它将一个URL路径和一个函数进行映射,例如:
/users -> getAllUsers()
/users/count -> getUsersCount()
这就是两条路由,当访问/users的时候,会执行getAllUsers()函数;当访问/users/count的时候,会执行getUsersCount()函数。
而router可以理解为一个容器,或者说一种机制,它管理了一组route。简单来说,route只是进行了URL和函数的映射,而在当接收到一个URL之后,去路由映射表中查找相应的函数,这个过程是由router来处理的。一句话概括就是 “The router routes you to a route”。
3. 服务器端路由
对于服务器来说,当接收到客户端发来的HTTP请求,会根据请求的URL,来找到相应的映射函数,然后执行该函数,并将函数的返回值发送给客户端。对于最简单的静态资源服务器,可以认为,所有URL的映射函数就是一个文件读取操作。对于动态资源,映射函数可能是一个数据库读取操作,也可能是进行一些数据的处理,等等。
以Express为例,
app.get("/", (req, res) => { res.sendFile("index")})app.get("/users", (req, res) => { db.queryAllUsers() .then(data => res.send(data))})
这里定义了两条路由:
当访问/的时候,会返回index页面当访问/users的时候,会从数据库中取出所有用户数据并返回
不仅仅是URL
在router匹配route的过程中,不仅会根据URL来匹配,还会根据请求的方法来看是否匹配。例如上面的例子,如果通过POST方法来访问/users,就会找不到正确的路由。
4. 客户端路由
对于客户端(通常为浏览器)来说,路由的映射函数通常是进行一些DOM的显示和隐藏操作。这样,当访问不同的路径的时候,会显示不同的页面组件。客户端路由最常见的有以下两种实现方案:
基于Hash基于History API
(1) 基于Hash
我们知道,URL中#及其后面的部分为hash。例如:
const url = require("url")var a = url.parse("http://example.com/a/b/#/foo/bar")console.log(a.hash)// => #/foo/bar
hash仅仅是客户端的一个状态,也就是说,当向服务器发请求的时候,hash部分并不会发过去。
通过监听window对象的hashChange事件,可以实现简单的路由。例如:
window.onhashchange = function() { var hash = window.location.hash var path = hash.substring(1) switch (path) { case "/": showHome() break case "/users": showUsersList() break default: show404NotFound() }}
(2) 基于History API
通过HTML5 History API可以在不刷新页面的情况下,直接改变当前URL。详细用法可以参考:
Manipulating the browser historyUsing the HTML5 History API我们可以通过监听window对象的popstate事件,来实现简单的路由:
window.onpopstate = function() { var path = window.location.pathname switch (path) { case "/": showHome() break case "/users": showUsersList() break default: show404NotFound() }}
但是这种方法只能捕获前进或后退事件,无法捕获pushState和replaceState,一种最简单的解决方法是替换pushState方法,例如:
var pushState = history.pushStatehistory.pushState = function() { pushState.apply(history, arguments) // emit a event or just run a callback emitEventOrRunCallback()}
不过,最好的方法还是使用实现好的history库。
(3) 两种实现的比较
总的来说,基于Hash的路由,兼容性更好;基于History API的路由,更加直观和正式。
但是,有一点很大的区别是,基于Hash的路由不需要对服务器做改动,基于History API的路由需要对服务器做一些改造。下面来详细分析。
假设服务器只有如下文件(script.js被index.html所引用):
/- |- index.html |- script.js
基于Hash的路径有:
http://example.com/http://example.com/#/foobar
基于History API的路径有:
http://example.com/http://example.com/foobar
当直接访问http://example.com/的时候,两者的行为是一致的,都是返回了index.html文件。
当从http://example.com/跳转到http://example.com/#/foobar或者http://example.com/foobar的时候,也都是正常的,因为此时已经加载了页面以及脚本文件,所以路由跳转正常。
当直接访问http://example.com/#/foobar的时候,实际上向服务器发起的请求是http://example.com/,因此会首先加载页面及脚本文件,接下来脚本执行路由跳转,一切正常。
当直接访问http://example.com/foobar的时候,实际上向服务器发起的请求也是http://example.com/foobar,然而服务器端只能匹配/而无法匹配/foobar,因此会出现404错误。
因此如果使用了基于History API的路由,需要改造服务器端,使得访问/foobar的时候也能返回index.html文件,这样当浏览器加载了页面及脚本之后,就能进行路由跳转了。
5. 动态路由
上面提到的例子都是静态路由,也就是说,路径都是固定的。但是有时候我们需要在路径中传入参数,例如获取某个用户的信息,我们不可能为每个用户创建一条路由,而是在通过捕获路径中的参数(例如用户id)来实现。
例如在Express中:
app.get("/user/:id", (req, res, next) => { // ... ...})在Flask中:@app.route("/user/")def get_user_info(user_id): pass
6. 严格路由
在很多情况下,会遇到/foobar和/foobar/的情况,它们看起来非常类似,然而实际上有所区别,具体的行为也是视服务器设置而定。
在Flask的文档中,提到,末尾有斜线的路径,类比于文件系统的一个目录;末尾没有斜线的路径,类比于一个文件。因此访问/foobar的时候,可能会重定向到/foobar/,而反过来则不会。
如果使用的是Express,默认这两者是一样的,也可以通过app.set来设置strict routing,来区别对待这两种情况。
标签:
相关推荐:
最新新闻:
- 电脑输入法为什么打不出汉字?修复一下即可 轻松解决
- dell笔记本电脑驱动怎么样?2020笔记本电脑十大新锐品牌|全球视点
- 每日看点!如何利用Windows提供的API函数?三种常见中文内码的转换方法
- excel函数有哪些应用技巧?EXCEL常用函数的操作及使用技巧
- 今日视点:如何改善晚上睡不着?怎样提高深度睡眠时间?五个助眠小妙招帮助你快速入睡
- 什么是路由?router和route的区别在哪里?-最资讯
- 如何开通微信商城?开通微信商城的三步步骤
- 今日热讯:电影《饥饿游戏:鸣鸟与蛇之歌》新预告 残酷生存逃杀游戏再启
- 电脑系统还原怎么操作?还原电脑系统的具体操作方法
- 全球快消息!电脑桌面计算机文件打不开怎么办?电脑开机桌面文件都点不开的解决方法
- 《红霞岛》全球解锁时间公布:国区5月2日早上8点
- 计算机中ufc是什么意思中文?UFC的英文全称以及中文意思
- NFS如何在windows10下使用及挂载?具体方法流程
- 腾讯WiFi管家手机无线上网免费下载安装 腾讯无线网络管家的应用程序
- 【全球热闻】面对硬盘磁头损坏问题如何解救?硬盘磁头损坏的解决方案
- 《荊棘:群山之王》登陆全平台发售 北欧传说黑暗世界冒险
- 手机连接不上电脑只显示充电怎么办?智能手机的OTG功能介绍
- 台式机使用笔记本电脑上网怎么设置?解决办法 全球新视野
- 【环球快播报】《洛克人EXE合集》全球销量现已突破100万
- 烫伤图片由一度到三度_烫伤图片 环球速看
- 如何通过电脑发送短信?如何用数据猫发送接收短消息? 全球滚动
- 《装甲核心6》限定收藏版内容公开 机甲雕像精致极品|每日速递
- 环球快报:重装系统后老系统的回收站如何删除?详情步骤流程
- 世界动态:时组词有哪些_时组词
- 桌面上计算机快捷方式打不开怎么办?桌面快捷方式打不开解决步骤-环球新资讯
- 今日精选:柳工2022年度分配预案:拟10派1元
- 格力手机刷机教程:MIUI-N刷机方法 热头条
- 焦点快报!【新思想引领新征程】生态优先绿色发展 绘就万里长江新图景
- 交银国际:维持比亚迪股份“买入”评级 目标价309.7港元-每日观点
- 当前最新:重生:现在还不是开发《泰坦陨落3》的时候
- 天天热推荐:4月28日江西地区氢氟酸市场价格暂稳
- 中控技术:4月27日融券净卖出2.04万股,连续3日累计净卖出34.45万股
- 全球观点:4月28日福建地区氢氟酸市场价格暂稳
- 南模生物:4月27日融资买入18.97万元,融资融券余额4937.58万元_天天热议
- “榆”见最美花海 满都海公园邀您来打卡
- 猛龙已获得面试几位联盟顶级助教的许可 包括勇士助教阿特金森等
- 到张家界,嗨游“五一”丨全国唯一!张家界100名导游持“急救证”上岗了-环球热讯
- 阳泉:“综合治费”蹚出新路
- 291.58吨!全国黄金消费量一季度大增12%
- 世界快看点丨创意海报丨“五一”旅游攻略手账 带你玩转美丽河北①
- 烟台市芝罘区市场监管局凤凰台市场监管所 “多措并举”开展学校食堂及其周边安全大检查
- 国内油价调价窗口28日开启 “五一”假期前有望下调-世界快报
- 当前简讯:英特尔:一季度营收同比跌36%,环比跌16%至117亿美元
- 黄土高原圈舍里的科技密码 看完让人“羊了个羊”
- 保时捷新款帕拉梅拉曝光!内饰“全面翻新”,比卡宴还要豪华
- 基金增仓助推股价大涨 A股最强板块还能走多远!机构分歧明显加大
- 华纳《哥谭骑士》官方发文或暗示新DLC:大反派集结
- “小李子”新片《花月杀手》新剧照 讲述印第安人谋杀疑案
- “乙类乙管”后的首个“五一”假期,如何安全出游?-今日视点
- 环球时讯:8型中型坦克
- 《装甲核心6》Steam 298元 确认有多结局|世界独家
- 世界快资讯:预计1.2亿人次!超历史同期最高水平
- 世界观点:flash崩溃报告_flash崩溃
- 每日热文:生态环境部:正制定生物多样性保护战略和行动计划
- 2023派出所过年有人值班吗
- 秦皇岛“扮靓”200余公里长城沿线
- 我找到了阅读GitHub项目源码的最佳姿势,太舒服了! 世界聚焦
- 首次上涨!碳酸锂止跌企稳?
- 天天时讯:润达医疗(603108)4月27日主力资金净卖出5944.26万元
- 天天简讯:西安经开区建区30年再出发 打造北跨发展先导区
- 万魔 1MORE Aero空间音频降噪耳机京东活动价仅549元!
- 扎哈罗娃:俄将对瑞典驱逐俄外交官作出回应-全球快资讯
- 环球速看:德林海(688069)2023年一季报简析:净利润减595.36%,三费占比上升明显
- 宫本茂感谢《超级马里奥兄弟大电影》媒体差评
- 动态选粉机工作原理_三分离选粉机工作原理
- 报道:邪王的玩宠txt下载_邪王的玩宠
- 天天即时:尼泊尔签发463张登顶珠峰许可证
- 这样的青春够“燃”!大鹏新区举办五四青年节主题活动-每日看点-实时焦点
- 10mm大动圈 万魔蓝牙耳机139元|天天百事通
- 19.7%!去年河北企业工业设备上云率全国第一
- 物业管理费计入什么费用(物业管理费计入什么科目)
- 描写春雨的诗歌作文 描写春雨的诗
- 当前消息!为打击贩毒 拜登宣布美国进入国家紧急状态
- 索尼家用/商用全系显示产品亮相!98寸大电视爽玩PS5_每日消息
- 深壹度丨最高年薪升至65万元,四川是如何成为公务员“聘任”大省的?_当前热议