CN117118905B - 一种路由注册、路由调用方法及装置 - Google Patents

一种路由注册、路由调用方法及装置 Download PDF

Info

Publication number
CN117118905B
CN117118905B CN202311382057.8A CN202311382057A CN117118905B CN 117118905 B CN117118905 B CN 117118905B CN 202311382057 A CN202311382057 A CN 202311382057A CN 117118905 B CN117118905 B CN 117118905B
Authority
CN
China
Prior art keywords
middleware
route
target
routing
array
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202311382057.8A
Other languages
English (en)
Other versions
CN117118905A (zh
Inventor
王文杰
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Sohu New Power Information Technology Co ltd
Original Assignee
Beijing Sohu New Power Information Technology Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Sohu New Power Information Technology Co ltd filed Critical Beijing Sohu New Power Information Technology Co ltd
Priority to CN202311382057.8A priority Critical patent/CN117118905B/zh
Publication of CN117118905A publication Critical patent/CN117118905A/zh
Application granted granted Critical
Publication of CN117118905B publication Critical patent/CN117118905B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L45/00Routing or path finding of packets in data switching networks
    • H04L45/74Address processing for routing
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L67/00Network arrangements or protocols for supporting network services or applications
    • H04L67/50Network services
    • H04L67/56Provisioning of proxy services
    • H04L67/563Data redirection of data network streams
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L67/00Network arrangements or protocols for supporting network services or applications
    • H04L67/50Network services
    • H04L67/56Provisioning of proxy services
    • H04L67/566Grouping or aggregating service requests, e.g. for unified processing

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Networks & Wireless Communication (AREA)
  • Signal Processing (AREA)
  • Data Exchanges In Wide-Area Networks (AREA)

Abstract

本申请公开了一种路由注册、路由调用方法及装置,本申请方案在注册路由时,对路由注册地址对应的路由动作进行了逻辑拆分,减小了单个中间件的业务逻辑粒度,配置出了包括至少一个中间件的中间件数组;由于一个中间件对应至少一个路由注册地址,即在配置中间件数组时,可以对现有的中间件进行复用,无需重复编写,因此,本申请能够在一定程度上降低路由注册难度,提高路由注册效率;而后生成包含路由注册地址、映射结构和中间件数组的路由单元,以便在调用路由注册地址对应的路由地址时,借由各个路由单元中的映射结构,查找出与路由地址对应的目标路由单元,而后调用目标路由单元中的中间件数组,最终实现路由地址的调用任务。

Description

一种路由注册、路由调用方法及装置
技术领域
本申请涉及计算机技术领域,更具体的说,是涉及一种路由注册、路由调用方法及装置。
背景技术
路由(Router)是指,根据不同的路由地址(即URL地址),调用不同的事件,实现不同的动作。简单来说,路由可以看作是,利用预先定义的处理规则对输入数据进行处理,得到并输出特定格式的新数据的过程。
当前,通常采取基于路由地址所要实现的业务功能,编写并创建该路由地址对应的中间件的方式,进行路由注册。也就是说,每个中间件只用于实现其对应的路由地址的调用任务。
随着不同路由地址所要实现的业务功能的复杂化和多样化,路由注册的难度越来越高。如何提高路由注册的效率,成为本领域技术人员亟需解决的问题。
发明内容
鉴于上述问题,提出了本申请以便提供一种路由注册、路由调用方法及装置,以降低路由注册难度、提高路由注册效率。
具体方案如下:
第一方面,提供了一种路由注册方法,包括:
获取待注册的路由注册地址;
配置所述待注册的路由注册地址对应的中间件数组,所述中间件数组包括一个或多个中间件,所述多个中间件用于:被依次调用以实现所述待注册的路由注册地址对应的路由动作,每一个所述中间件对应至少一个路由注册地址;
依据所述待注册的路由注册地址,生成映射结构,所述映射结构用于匹配所述待注册的路由注册地址对应的待调用的路由地址;
生成所述待注册的路由注册地址的路由单元,所述路由单元包括:所述待注册的路由注册地址、所述中间件数组和所述映射结构。
第二方面,提供了一种路由注册装置,包括:
路由注册地址获取模块,用于获取待注册的路由注册地址;
中间件数组配置模块,用于配置所述待注册的路由注册地址对应的中间件数组,所述中间件数组包括一个或多个中间件,所述多个中间件用于:被依次调用以实现所述待注册的路由注册地址对应的路由动作,每一个所述中间件对应至少一个路由注册地址;
映射结构配置模块,用于依据所述待注册的路由注册地址,生成映射结构,所述映射结构用于匹配所述待注册的路由注册地址对应的待调用的路由地址;
路由单元生成模块,用于生成所述待注册的路由注册地址的路由单元,所述路由单元包括:所述待注册的路由注册地址、所述中间件数组和所述映射结构。
第三方面,提供了一种路由调用方法,包括:
从预配置的路由单元组中,查找具备与待调用的目标路由地址匹配的映射结构的目标路由单元;所述路由单元组包括若干个按照上述的路由注册方法生成的路由单元;
获取所述目标路由单元中的目标中间件数组;
按照预设的调用规则,调用所述目标中间件数组中的中间件,以实现所述目标路由地址对应的路由动作;所述预设的调用规则包括:在所述目标中间件数组包括多个中间件的情况下,按照先后顺序依次调用所述目标中间件数组中的各个中间件。
第四方面,提供了一种路由调用装置,包括:
目标路由单元获取模块,用于从预配置的路由单元组中,查找具备与待调用的目标路由地址匹配的映射结构的目标路由单元;所述路由单元组包括若干个按照上述的路由注册方法生成的路由单元;
目标中间件数组获取模块,用于获取所述目标路由单元中的目标中间件数组;
路由实现模块,用于按照预设的调用规则,调用所述目标中间件数组中的中间件,以实现所述目标路由地址对应的路由动作;所述预设的调用规则包括:在所述目标中间件数组包括多个中间件的情况下,按照先后顺序依次调用所述目标中间件数组中的各个中间件。
借由上述技术方案,本申请在进行路由注册时,配置了待注册的路由注册地址对应的中间件数组,在所述中间件数组只包括一个中间件的情况下,该中间件用于被调用以实现所述路由注册地址对应的路由动作,在所述中间件数组包括多个中间件的情况下,所述多个中间件用于被依次调用以实现所述路由注册地址对应的路由动作。也就是说,本申请在进行路由注册时,可以对路由动作进行业务逻辑拆分,在一定程度上减小了每一个中间件对应的业务逻辑的粒度,可以在一定程度上增加单个中间件的适用性,使得每一个中间件能够对应至少一个路由注册地址。基于此,在配置一个新的路由注册地址对应的中间件数组时,可以利用现有的中间件,以实现相同的业务逻辑,无需重复编写相同的中间件,因此,本申请能够在一定程度上降低路由注册难度,提高路由注册效率。而后依据所述待注册的路由注册地址,生成映射结构,由所述路由注册地址、所述中间件数组和所述映射结构生成所述路由注册地址的路由单元。基于此,可以在调用所述路由注册地址对应的路由地址时,借由各个路由单元中的映射结构,查找出与所述路由地址对应的目标路由单元,并通过调用所述目标路由单元中的中间件数组,实现所述路由地址的调用任务。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本申请的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1是根据本申请实施例示出的一种路由注册方法的流程示意图;
图2是根据本申请实施例示出的一种路由调用方法的流程示意图;
图3示例了compose函数的执行过程示意图;
图4示例了依据正则路径生成映射结构的过程示意图;
图5示出了创建待注册的路由注册地址的路由单元的过程示意图;
图6示出了中间件数组的调用过程示意图;
图7是根据本申请实施例示出的另一种路由调用方法的流程示意图;
图8示例了路由调用过程中的缓存空间内的路由单元缓存情况;
图9示例了一种应用静态语言swift实现路由调用的过程示意图;
图10是根据本申请实施例示出的一种路由注册装置的结构示意图;
图11是根据本申请实施例示出的一种路由调用装置的结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本案申请人发现,在日常开发过程中,经常会遇到各个功能模块相互引用的情况,例如,收藏功能模块依赖于登录功能模块,收藏功能模块需要与登录功能模块相互调用。当前,通常采取在现有的功能实现代码中增加业务埋点的方式,来实现不同功能模块间的相互调用。该方案增加了不同的功能实现代码间的耦合程度,与低耦合、高内聚、职责单一、逻辑清晰的代码设计规则不符;并且随着软件功能和业务逻辑的复杂化,通过加入埋点来实现模块间调用的方式,容易产生回调地狱。
为解决上述问题,本申请提供了一种路由注册、路由调用方法及装置,本申请借由小粒度的中间件来实现路由任务,降低了路由注册难度,并且可以避免回调地狱。
图1是根据本申请实施例示出的一种路由注册方法的流程示意图。结合图1所示,本申请实施例提供的路由注册方法可以包括下述步骤:
步骤S101、获取待注册的路由注册地址。
示例性的,本申请实施例涉及路由注册地址、路由地址遵循的URL格式可以表示为:
protocol://host/path-component/:path-parameter?query
其中,protocol表示协议,host表示主机号,path-component表示路径组分,path-parameter表示路径参数,query表示查询参数。路由注册地址中的路径参数部分可以是路径参数名;路由地址中的路径参数部分可以是路径参数值,也可以是由路径参数名和路径参数值构成的路径参数对。
步骤S102、配置所述待注册的路由注册地址对应的中间件数组。
其中,所述中间件数组包括一个或多个中间件,每一个所述中间件是用于实现某一业务动作的独立的函数或闭包,所述中间件可以被单独执行,也可以与其他的中间件组合后被执行。在所述中间件数组只包括一个中间件的情况下,所述中间件用于被调用以实现所述待注册的路由注册地址对应的路由动作;在所述中间件数组包括多个中间件的情况下,所述多个中间件用于被依次调用以实现所述待注册的路由注册地址对应的路由动作。
此外,每一个所述中间件对应至少一个路由注册地址。也就是说,上述的步骤S102中的配置可以是指,通过创建新中间件的方式或直接引用现有中间件的方式,来配置所述中间件数组。
示例性的,登录、注册、重置密码等业务动作均需要校验密码是否合规,因此,可以定义用于实现密码校验任务的中间件,以便将该中间件配置给登录、注册、重置密码等业务动作各自对应的路由注册地址的中间件数组。
步骤S103、依据所述待注册的路由注册地址,生成映射结构。
其中,所述映射结构可以用于:匹配所述待注册的路由注册地址对应的待调用的路由地址。
步骤S104、生成所述待注册的路由注册地址的路由单元。
其中,所述路由单元可以包括:所述待注册的路由注册地址、所述中间件数组和所述映射结构。基于此,在调用某一路由地址时,可以依据各个预先生成的路由单元中的映射结构,查找出于该路由地址对应的路由单元,确定并调用该路由地址对应的中间件数组,最终实现该路由地址的调用任务。
可选的,在生成所述待注册的路由注册地址的路由单元之后,可以将所述待注册的路由注册地址的路由单元存入路由单元组。示例性的,所述路由单元组可以是预先在路由对象Route中配置的数组,路由单元组Routes内存储着多个路由单元RouteItem,路由单元也可以称作路由注册对象。
上述的路由注册方法,配置了路由注册地址对应的中间件数组,通过调用该中间件数组能够实现路由注册地址对应的路由动作。由于中间件数组可以包括多个中间件,也就是说,本方案配置的中间件具备更小的粒度,并且,在本申请提供的路由实现方案中,每一个中间件都是一个独立的函数或者说闭包。基于此,实现某一业务功能的中间件可以被配置在不同的路由注册地址对应的中间件数组中,即本方案采用复用中间件的方式,实现了相同的业务逻辑,因此无需在其他的功能模块中添加埋点,解决了不同功能模块间的代码耦合问题,实现了示例如不同的APP组件之间和APP页面之间的解耦合,可以在一定程度上避免产生回调地狱,便于后续的开发维护。
图2是根据本申请实施例示出的一种路由调用方法的流程示意图。结合图2所示,所述路由调用方法可以包括下述步骤:
步骤S201、从预配置的路由单元组中,查找具备与待调用的目标路由地址匹配的映射结构的目标路由单元。
其中,所述路由单元组可以包括若干个按照本申请实施例提供的路由注册方法生成的路由单元,示例如按照图1所示的路由注册方法。
步骤S202、获取所述目标路由单元中的目标中间件数组。
步骤S203、按照预设的调用规则,调用所述目标中间件数组中的中间件,以实现所述目标路由地址对应的路由动作。
其中,所述预设的调用规则包括:在所述目标中间件数组包括多个中间件的情况下,按照先后顺序依次调用所述目标中间件数组中的各个中间件;在所述目标中间件数组只包括一个中间件的情况下,调用该中间件。
上述的路由实现方案,在进行路由注册时,配置了待注册的路由注册地址对应的中间件数组,所述中间件数组包括至少一个中间件,也就是说,本申请在进行路由注册时,可以对该注册地址所要实现的路由动作进行业务逻辑拆分,从而在一定程度上减小了每一个中间件对应的业务逻辑的粒度,在一定程度上增加了单个中间件的适用性,使得每一个中间件能够对应至少一个路由注册地址。基于此,在配置一个新的路由注册地址对应的中间件数组时,可以利用现有的中间件,以实现相同的业务逻辑,无需重复编写相同的中间件,因此,本申请能够在一定程度上降低路由注册难度,提高路由注册效率。而后依据所述待注册的路由注册地址,生成映射结构,由所述路由注册地址、所述中间件数组和所述映射结构生成所述路由注册地址的路由单元。基于此,可以在调用所述路由注册地址对应的路由地址时,借由各个路由单元中的映射结构,查找出与所述路由地址对应的目标路由单元,而后调用所述目标路由单元中的中间件数组,最终实现所述路由地址的调用任务。
需要说明的是,在借由静态语言swift实现的路由实现方案中,可以通过compose函数的实现:将中间件数组中的各个中间件通过调用函数next串连起来。compose函数的源码如下所示:
//参数说明:callBacks表示中间件数组,ctx表示上下文对象
//返回值为NextCallBack
private func compose(_ callBacks:[MiddlewareCallBack],_ ctx:Context)-> NextCallBack? {
//定义next函数
func dispatchNext(i:Int) -> NextCallBack?{
//最后一个中间件的next指向nil(空)
if i>=callBacks.count {
return nil
}
//根据下标获取中间件
let callback = callBacks[i]
return{
//递归调用,i+1,指向下一个next函数
let next = dispatchNext(i: i+1)
var ctx = ctx
ctx.next = next
return callback(ctx,next)
}
}
//返回一个next函数,i为callBacks下标,i=0内部指向第一个中间件,
return dispatchNext(i: 0)
}
示例性的,图3以由三个中间件构成的中间件数组为例,示出了compose函数的执行过程示意图。结合图3所示,compose函数可以通过高阶函数,内部递归调用dispatchNext函数,实现中间件中next函数的赋值;dispatchNext函数是一个递归函数,参数i表示中间件数组callBacks下标,用来生成next参数,返回值指向中间件;在定义next函数中,调用dispatchNext函数,传入i+1以获取下一个中间件的next函数,作为当前中间件参数next传入;i>=callBacks.count,作为递归跳出条件,即最后一个中间件的next参数指向nil(空值)。如果用fn表示compose函数的返回值,则执行fn实际就是执行中间件数组中的第一个中间件middleware1。
接下来本申请实施例提供的路由单元中的映射结构进行说明。
在本申请提供的一些实施例中,所述待注册的路由注册地址可以包含有:协议、主机号、路径组分、路径参数名和查询参数。
需要说明的是,所述待注册的路由注册地址中包含的路径参数名为路径参数path-parameter的参数名key。
在上述的基础上,步骤S103、依据所述待注册的路由注册地址,生成映射结构,可以包括如下步骤:
步骤A、生成所述待注册的路由注册地址对应的正则路径。
其中,所述正则路径由所述主机号、所述路径组分和所述路径参数名构成。假设待注册的路由注册地址path为:protocol://host/path-component/:path-parameter?query,则对应的正则路径regex.path可以表示为:host/path-component/:path-parameter。也就是说,在创建路由单元、生成映射结构时,不传入路由注册地址的协议protocol。
步骤B、利用预设的第一正则表达式对所述正则路径进行处理,以提取所述正则路径中的全部的路径参数名,由提取到的路径参数名构成路径参数组。
其中,所述预设的第一正则表达式为:“:[\w]+[^/]*”。需要说明的是,在正则表达式中,^表示限定开头,例如:^a表示以a开头,若^在中括号“[]”中被使用,则表示字符类的否定、表示在这个字符集中不包含,例如:[^a]表示匹配除了a的任意字符。基于此,第一正则表达式中的\w表示匹配数字、大小写字母和下划线,[^/]表示不含包“/”开头,*表示匹配多个。
此外,路径参数组groups是由提取出的全部路径参数名key构成的数组。在本申请提供的一些实施例中,所述路由单元还可以包括:所述路径参数组。
步骤C、对于所述路径参数组中的每一个路径参数名,将所述正则路径中的所述路径参数名替换为预设的第二正则表达式,并在路径尾端拼接$,得到所述映射结构。
其中,所述预设的第二正则表达式为:“([^/]+)”。
特殊的,如果所述正则路径以“/”开头,例如所述正则路径中的主机号host为空,则在开头处添加“^”。示例性的,假设正则路径regex.path为host/path-component/:path-parameter,则生成的路径参数组groups为[:path-parameter],生成的映射结构pattern为host/path-component/([^/]+)$;假设正则路径regex.path为/path-component/:path-parameter,则生成的路径参数组groups为[:path-parameter],生成的映射结构pattern为^/path-component/([^/]+)$。
假设路由注册时传入的待注册的路由注册路径path为:http://www.test.com/:title/:message,由步骤A生成的正则路径regex.path为:www.test.com/:title/:message,在此基础上,图4示例了依据正则路径生成映射结构的过程示意图。结合图4所示,先利用第一正则表达式:[\w]+[^/]*提取正则路径regex.path中的路径参数名key,由提取到的各个路径参数名key生成路径参数组groups,可以表示为:groups:[:title ,:message];而后按照预设的生成规则,生成用于匹配路由地址URL的映射结构pattern,可以表示为:www.test.com/([^/]+)/([^/]+)$,其中,所述预设的生成规则为:1.遍历路由参数组groups,将其中的路径参数名key在正则路径regex.path中的位置,替换为第二正则表达式([^/]+);2.如果正则路径regex.path以“/”开头,则添加“^”;3.拼接“$”。
本申请实施例提供的路由注册及路由调用方案可以借由静态语言swift在IOS平台上实现,在创建待注册的路由注册地址的路由单元之前,需要先创建路由实例对象,例如:let router = WJRouter();并配置用于实现所述待注册的路由注册地址对应的业务动作的中间件数组中的各中间件,而后再创建待注册的路由注册地址的路由单元。示例性的,图5示出了创建待注册的路由注册地址的路由单元的过程示意图,结合图5所示,该过程可以包括:
第一步、调用route.user(path,callbacks),path表示待注册的路由注册地址,callbacks表示中间件数组;
第二步、创建对应的路由单元routeItem,在其中记录待注册的路由注册地址path及其中间件数组callbacks;
第三步、在第二步创建的路由单元routeItem中,创建初始化的regex,而后生成并记录路径参数组groups和映射结构pattern;
第四步、将创建完成的路由单元保存在路由对象中的路由单元组route.routes中。
在上述的基础上,借由静态语言swift在IOS平台上实现本申请实施例提供的路由调用方案时,可以使用routeItem.isMatch方法,查找待调用的目标路由地址path对应的目标路由单元,具体的,routeItem.isMatch方法可以表示为:isMatch(path:String) ->Bool,用于依据已注册的路由单元中的映射结构,判断输入的路由地址path是否与已注册的路由单元中的路由注册地址匹配。
下面对本申请实施例涉及的中间件进行说明。
在本申请提供的一些实施例中,所述中间件的输入参数由上下文对象提供,所述上下文对象是在调用所述待调用的路由地址时创建的,且对应于所述中间件数组中的各个中间件的上下文对象。
在本申请提供的一些实施例中,所述中间件中包含有用于调用所述中间件数组中的下一个中间件的调用函数next,其中,在所述中间件为所述中间件数组中的最后一个中间件的情况下,所述中间件中的所述调用函数next的执行结果为空。
需要说明的是,虽然中间件本质上是一个独立的函数或闭包,但是中间件数组中的各个中间件的输入参数,均由同一个上下文对象提供,也就是说,可以借由调用时创建的上下文对象,实现同一个中间件数组中的各个中间件之间的参数传递任务。
也就是说,对于所述路由单元中的中间件数组,所述中间件数组中的每一个中间件可以被配置为:该中间件的输入参数由上下文对象提供,并且,该中间件中包含有用于调用所述中间件数组中的下一个中间件的调用函数next。
在上述的基础上,上述的步骤S203、按照预设的调用规则,调用所述目标中间件数组中的中间件,可以包括:
依据预先创建的目标上下文对象,调用并执行所述目标中间件数组中的第一个中间件,将该中间件的执行结果写入所述目标上下文对象,并借由该中间件中的调用函数next,调用并执行所述目标中间件数组中的下一个中间件,直至调用完所述目标中间件数组中的各个中间件,所述目标上下文对象是在调用所述目标路由地址时创建的,且对应于所述目标中间件数组中的各个中间件的上下文对象,所述目标上下文对象中预先写有所述目标路由地址及其传入参数。
在一种可能的实现方式中,在IOS平台上借由静态语言swift实现的路由方案中,所配置的中间件遵守下述的格式规则,具体的:
typealias NextCallBack = () ->Any?
typealias MiddlewareCallBack = (_ ctx:Context, _ next:NextCallBack?)->Any?
也就是说,中间件的输入参数由上下文context对象提供;中间件中包含有指向下一个中间件调用的方法,即调用函数next,需要说明的是,调用函数next可以作为中间件的一个参数,执行调用函数next,即可实现对下一个中间件的调用任务;返回值Any?本质上返回的是中间件的返回值,表示中间件的返回值可以是任何类型。
示例性的,下述的代码示例1示出了借由静态语言swift实现业务动作加10的路由方案实现代码。具体代码如下:
//创建路由实例对象
let router = WJRouter()
//创建第一中间件middleware1
let middleware1:MiddlewareCallBack = { ctx, next in
//通过上下文ctx 获取传入参数
if let dic = ctx.object as? [String:String],let value = dic["key"] {
print("value:",value) //value: hello
}
//调用下一个中间件
if let result = next?() as? Int {
return result + 10
}
return 10
}
//创建第二中间件middleware2
let middleware2:MiddlewareCallBack = { ctx, next in
//返回10
return 10
}
//注册路由
router.use("add_10",middleware1,middleware2)
//调用路由
let paramer = ["key":"hello"]
let result = router.handlePath(path: "add_10",object: paramer)
print("result:",result ?? "") //result: 20
在代码示例1中,首先创建了第一中间件middleware1和第二中间件middleware2,第一中间件可以通过调用函数next调用下一个中间件,而后基于路由注册路径add_10进行了路由注册,路由注册路径add_10的中间件数组包括第一中间件middleware1和第二中间件middleware2。基于此,在调用路由路径add_10时,先调用第一中间件middleware1,第一中间件middleware1借由其中的调用函数next调用下一个中间件,在调用函数next的返回值为空的情况下,第一中间件middleware1的返回值为10,在调用函数next的返回值不为空的情况下,即返回了第二中间件middleware2的情况下,第一中间件middleware1的返回值为result+10,由于第二中间件middleware2的返回值为一个int型数据,即数值10,且路由地址add_10的调用结果本质上是第一中间件middleware1的返回值,则路由地址add_10的调用结果为10+10=20。
需要说明的是,代码示例1示出了一种借由中间件返回值确定执行结果的方案,这种获取执行结果的方式,可以适用于同步执行的中间件。在实际场景下,经常需要执行异步方法,配置异步执行的中间件,示例如用于实现网络请求的中间件。
为获取同步执行或异步执行的中间件的执行结果,在本申请提供的一些实施例中,所述上下文对象中包含有:第一回调函数和第二回调函数。
其中,所述第一回调函数用于:在所述中间件执行成功的情况下被调用,以在所述上下文对象中记录用于表征所述中间件执行成功的信息;所述第二回调函数用于:在所述中间件执行失败的情况下被调用,以在所述上下文对象中记录用于表征所述中间件执行失败的信息。
示例性的,下述的代码示例2示出了借由静态语言swift实现登录动作的路由方案实现代码,其中包含了借由第一回调函数和第二回调函数获取中间件执行结果的实现过程。具体的:
//创建路由实例对象
let router = WJRouter()
//创建登录中间件
let loginMiddleware:MiddlewareCallBack = { ctx, next in
//通过ctx 获取传入参数
guard let object = ctx.object as? [String:String],let password =object["password"],
let pathParameter = ctx.pathParameter,let account = pathParameter["account"] else{
return
}
print(password, account)
//模拟登录耗时
DispatchQueue.main.asyncAfter(deadline: .now()+0.5) { //耗时0.5秒
var success = true
if success {
//设置中间件参数token
ctx.middlewareMap["token"] = "tokenstring"
next?() //登录成功 执行下一个中间件
}else{
ctx.fail?(ctx,"loginMiddleware","登录接口调用失败")
}
}
return nil
}
//创建用户信息中间件
let userInfoMiddleware:MiddlewareCallBack = { ctx, next in
//获取token信息
if let token = ctx.middlewareMap["token"]{
print(token)
}
//模拟登录耗时
DispatchQueue.main.asyncAfter(deadline: .now()+0.5) { //耗时0.5秒
var success = true
let response = ["data":
[
"name":"admin",
"age":"18",
"birthday":"2023.02.10"
]
]
if success {
ctx.complete?(ctx,"userInfoMiddleware",response) //成功获取用户信息
}else{
ctx.fail?(ctx,"loginMiddleware","登录接口调用失败")
}
}
return nil
}
//注册路由
router.use("/login/:account",loginMiddleware,userInfoMiddleware)
//调用路由
let paramer = ["password":"123456"]
let account = "admin"
router.handlePath(path: "/login/\(account)",object: paramer,complete: { ctx, identifier, response in
//打印中间件标识
print(identifier) //userInfoMiddleware
//打印用户信息
if let data = response["data"], let jsonData = try?JSONSerialization.data(withJSONObject: data), let json = String(data:jsonData, encoding: String.Encoding.utf8){
print(json)//打印结果:{"age":"18","name":"admin","birthday":"2023.02.10"}
}
},fail: { ctx, identifier, errorMessage in
print(identifier,errorMessage)
}
上述的代码示例2,路由注册地址为login/:account,其中:account是路径参数,即用户账号;在调用该注册地址对应的路由地址/login/admin时,可以解析得到对应的路径参数,即account=admin,还可以从上下文对象中解析得到传入参数object={"password":"123456"}。在此基础上,依次调用配置给路由注册地址login/:account的登录中间件loginMiddleware和获取用户信息中间件userInfoMiddleware,以实现登录动作。具体的,先执行登录中间件loginMiddleware,该中间件通过上下文ctx获取参数ctx.object和ctx.pathParameter,即密码password密码和对应的账号account账号;而后模拟登录耗时0.5s,如果未登录成功,则调用第二回调方法ctx.fail,以表征登录接口调用失败,如果登录成功,则借由上下文对象中的ctx参数middlewareMap,设置中间件参数token,执行该中间件中的调用函数next,以开始执行获取用户信息中间件userInfoMiddleware;该中间件在执行时,通过ctx.middlewareMap获取token,而后模拟登录耗时,如果登录成功,将回复response设置为用户信息,并调用第一回调方法ctx.complete,以表征获取用户信息成功;如果登录未成功,则调用第二回调方法ctx.fail,以表征获取用户信息失败。
示例性的,图6示出了中间件数组的调用过程示意图。结合图6所示,预先在上下文对象中定义了第一回调函数ctx.complete和第二回调函数ctx.fail。通过调用第一回调函数ctx.complete,能够在上下文对象中记录并打印表征中间件执行成功的信息,其中,identifier为中间件标识符,可以从上下文对象中获取;通过调用第二回调函数ctx.fail,能够在上下文对象中记录并打印表征中间件执行失败的信息及具体的报错信息。所调用的中间件数组包括第一中间件middleware1、第二中间件middleware2和第三中间件middleware3。在调用该中间件数组的过程中,先执行第一中间件middleware1,第一中间件middleware1执行成功,调用第一回调函数ctx.complete,而后执行其中的调用函数next,以调用并开始执行第二中间件middleware2;第二中间件middleware2执行失败,调用第二回调函数ctx.fail,而后执行其中的调用函数next,以调用并开始执行第三中间件middleware3;第三中间件middleware3执行成功,调用第一回调函数ctx.complete,而后执行其中的调用函数next,返回结果为空null,则表征中间件数组中的全部中间件执行完成,结束该中间件数组的调用过程,最终该中间件的打印结果如图6所示。
在一种可能的实现方式中,所述中间件可以通过其对应的上下文对象,和/或,返回值进行传值交互。下述的代码示例3和代码示例4分别示出了两种传值交互方式的代码实现。
代码示例3示例了利用中间件返回值,计算三个1之和的实现代码,具体的:
//注册路由,所要实现的业务动作为计算三个1之和
route.use("/add_3_1", add_1(_:_:),add_1(_:_:),add_1(_:_:))
//创建中间件
func add_1(_ ctx:Context,_ next:NextCallBack?) -> Int {
//执行调用函数next,得到返回值,并在返回值的基础上+1
if let result = next?() as? Int {
return result + 1
}
//如果执行调用函数next的返回结果为空,则返回数值1
return 1
}
//调用路由
let result = route.handlePath(path: "/add_3_1")
print(result) //返回结果为3
代码示例4示例了利用上下文对象传值,完成登录成功后保存token的实现代码,具体的:
//创建登录请求中间件
func login(_ ctx:Context,_ next:NextCallBack?) {
requestLogin { success,token in //请求登录接口
if(succeed){ //登录成功
ctx.object = token //记录token,
next?() //执行下一个中间件
}else{
ctx.fail?(ctx,"loginError","登录请求失败") //执行中间件失败回调
}
}
}
//创建登录成功中间件
func loginSuccess(_ ctx:Context,_ next:NextCallBack?) {
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
saveToken(ctx.object) //ctx.object值为login传递来的token,保存token值
ctx.complete?(ctx,"loginSuccess") //执行中间件完成回调
}
}
//调用路由
route.handlePath(path: "login", object: nil) { ctx, identifier in
if(identifier == "loginSuccess"){
print(identifier+"执行完成") //打印结果:"loginSuccess执行完成"
}
} fail: { ctx, identifier, errorMessage in
print(errorMessage) //打印结果:"登录请求失败"
}
//所配置的表征执行成功的第一回调方法CompleteCallBack和表征执行失败的第二回调方法FailCallBack
public typealias CompleteCallBack = (_ ctx:Context, _ identifier:String)->()
public typealias FailCallBack = (_ ctx:Context, _ identifier:String ,_ errorMessage: String)->()
//ctx表示中间件上下文,identifier表示中间件的唯一标识符,errorMessage表示中间件执行失败的描述(为第二回调方法FailCallBack独有)
图7是根据本申请实施例示出的另一种路由调用方法的流程示意图。结合图7所示,所述方法可以包括:
步骤S301、从缓存中查找具备与所述待调用的路由地址匹配的映射结构的目标路由单元,若查找未命中,执行步骤S302;若查找命中,执行步骤S303。
步骤S302、从预配置的路由单元组中,查找具备与待调用的目标路由地址匹配的映射结构的目标路由单元。
步骤S303、将所述目标路由单元写入所述缓存。
步骤S304-S305与上述的步骤S202-S203一致,在此不再赘述。可选的,步骤S303和步骤S304可以先后执行,可以同时执行。
上述的方法,通过在查找出目标路由单元后缓存该路由单元,并且在后续的路由调用过程中,优先在缓存中查找对应的路由单元,提高了路由查找效率。
在此基础上,为减少不常用的路由单元对缓存的占用,在本申请提供的一些实施例中,可以采取最近最少使用(Least Recently Used,LRU)缓存机制,缓存目标路由单元。示例性的,假设缓存容量为3,图8示例了路由调用过程中的缓存空间内的路由单元缓存情况。如图8所示,按照先后顺序调用的路由地址对应的目标路由单元编号依次为7、0、1、2、0、3、0、4,初始的缓存空间为空,按照调用顺序,依次将各个目标路由单元写入缓存空间,并不断清除缓存空间中的写入时间最久的目标路由单元,以保证缓存空间中的路由单元数量小于等于预设的缓存容量,特殊的,由于缓存空间是以栈的形式缓存各个路由单元的,即调用时间最晚的路由单元位于栈顶,调用时间最早的路由单元位于栈底,基于此,若将要写入目标路由单元已经存在于缓存空间,需要先删除已写入的该目标路由单元,再重新将该目标路由单元写入缓存空间。
示例性的,LRU缓存机制的实现源码如下所示:
class WJLRUCache<T> {
private var map = [String:Node<T>]()
private var capacity = 0
private var head:Node<T>
private var last :Node<T>
init(_ capacity: Int = 1000) {
self.capacity = capacity
head = Node()
last = Node()
head.next = last
last.pret = head
}
func get(_ key: String) -> T? {
guard let node = map[key] else {
return nil
}
remove(node: node);
moveToHead(node: node)
return node.value
}
func put(_ key: String, _ value: T) {
guard let node = map[key] else { //新元素
if map.count == capacity ,let lastNode = last.pret{
//移除最后一个元素
map.removeValue(forKey: lastNode.key)
map[lastNode.key] = nil
remove(node: lastNode)
}
let node = Node<T>()
node.key = key
node.value = value
map[key] = node
moveToHead(node: node)
return
}
//已存在,更新元素
node.value = value
map[key] = node
remove(node: node);
moveToHead(node: node)
}
private func remove(node:Node<T>) {
node.pret?.next = node.next
node.next?.pret = node.pret
}
private func moveToHead(node:Node<T>) {
node.next = head.next
head.next = node
node.next?.pret = node
node.pret = head
}
}
class Node<T> {
var next:Node?
var pret:Node?
var key:String = ""
var value:T?
}
图9示例了一种应用静态语言swift实现路由调用的过程示意图。如图9所示,通过调用route.handlePath(path, object, complete, fail)方法,实现路由任务。其中,path表示路由调用时的路由地址URL;object表示调用时传入参数;被存放在上下文context对象中,在中间件数组中的各个中间件的执行过程中都可以被访问;complete表示第一回调函数;fail表示第二回调函数。通过调用route.handlePath(path, object, complete,fail)方法,可以执行如下步骤:
第一步、从应用LRU缓存机制的缓存空间(即LRU缓存)中查找path匹配的路由单元routeItem,未找到执行第二步,找到执行第三步;
第二步、遍历路由单元组routes,查找路由地址path匹配的目标路由单元routeItem,未找到结束路由调用,找到执行第三步;
第三步、在查找到匹配的routeItem之后,对路由地址path进行参数解析,得到路径参数pathParameter和查询参数queryParameter;
示例性的,可以分别使用routeItem.getPathParameter和routeItem.getQueryParameter,解析得到路径参数pathParameter和查询参数queryParameter。具体的:
func getPathParameter(string:String) -> [String:String]?,
func getQueryParameter(query:String) -> [String:String]
其中,getPathParameter用于提取路由地址path中路径参数path-parameter,如:路由注册地址routeItem.path="/say/:title/:message",传入的路由地址为"/say/hello/word",则调用getPathParameter可以解析得到路径参数对:{"title":"hello", "message":"word"}。getQueryParameter用于提取路由地址path中查询参数query,如:路由注册地址routeItem.path="http://www.test.com",传入的路由地址为"http://www.test.com?userName=admin&password=123456",调用getQueryParameter可以解析得到查询参数对:{"userName":"admin", "password":"123456"}。
第四步、创建上下文context对象,将传入参数path、object、complete、fail、pathParameter和queryParameter写入上下文context对象;
第五步、执行compose函数,传入参数有上下文context对象和中间件数组callbacks,返回值是一个调用函数next;借由第五步可以实现,将中间件callBack通过next函数进行关联;
第六步、如果compose函数的返回值不为空,则执行所返回的next函数,即调用中间件数组callbacks中第一个中间件,而后依次调用中间件数组中的各中间件,直至compose函数的返回值为空。
需要说明的是,本申请实施例提供的路由注册方案和路由调用方案,共同构成了路由实现方案,可以采用静态语言应用在IOS平台上,以便解决ISO平台上的日常路由处理任务,实现下述功能:App内页面跳转功能、进程间通信、Universal Links、URL Scheme和3D-Touch功能等iOS平台独有的交互方式。相较于现有的ISO平台上的借由动态语言Objcet-c语言实现的JLRoutes 、MGJroute路由方案,本申请可以使用静态语言swift实现,实现方式更加安全,并且代码可读性更强,具备更高的实用性。
下面分别对本申请实施例提供的路由注册装置和路由调用装置进行描述,下文描述的路由注册装置、路由调用装置与上文描述的路由注册方法、路由调用方法可相互对应参照。
图10是根据本申请实施例示出的一种路由注册装置的结构示意图,如图10所示,所述路由注册装置可以包括:
路由注册地址获取模块11,用于获取待注册的路由注册地址;
中间件数组配置模块12,用于配置所述待注册的路由注册地址对应的中间件数组,所述中间件数组包括一个或多个中间件,所述多个中间件用于:被依次调用以实现所述待注册的路由注册地址对应的路由动作,每一个所述中间件对应至少一个路由注册地址;
映射结构配置模块13,用于依据所述待注册的路由注册地址,生成映射结构,所述映射结构用于匹配所述待注册的路由注册地址对应的待调用的路由地址;
路由单元生成模块14,用于生成所述待注册的路由注册地址的路由单元,所述路由单元包括:所述待注册的路由注册地址、所述中间件数组和所述映射结构。
在本申请提供的一些实施例中,所述中间件的输入参数由上下文对象提供,所述上下文对象是在调用所述待调用的路由地址时创建的,且对应于所述中间件数组中的各个中间件的上下文对象;
所述中间件中包含有用于调用所述中间件数组中的下一个中间件的调用函数next,其中,在所述中间件为所述中间件数组中的最后一个中间件的情况下,所述中间件中的所述调用函数next的执行结果为空。
在本申请提供的一些实施例中,所述上下文对象中包含有:第一回调函数和第二回调函数;
所述第一回调函数用于:在所述中间件执行成功的情况下被调用,以在所述上下文对象中记录用于表征所述中间件执行成功的信息;所述第二回调函数用于:在所述中间件执行失败的情况下被调用,以在所述上下文对象中记录用于表征所述中间件执行失败的信息。
在本申请提供的一些实施例中,所述待注册的路由注册地址包含有:协议、主机号、路径组分、路径参数名和查询参数。
在上述的基础上,所述映射结构配置模块13依据所述待注册的路由注册地址,生成映射结构的过程,可以包括:
生成所述待注册的路由注册地址对应的正则路径,所述正则路径由所述主机号、所述路径组分和所述路径参数名构成;
利用预设的第一正则表达式对所述正则路径进行处理,以提取所述正则路径中的全部的路径参数名,由提取到的路径参数名构成路径参数组;其中,所述预设的第一正则表达式为:“:[\w]+[^/]*”;
对于所述路径参数组中的每一个路径参数名,将所述正则路径中的所述路径参数名替换为预设的第二正则表达式,并在路径尾端拼接$,得到所述映射结构;其中,所述预设的第二正则表达式为:“([^/]+)”。
在上述的基础上,所述路由单元还可以包括:所述路径参数组。
图11是根据本申请实施例示出的一种路由调用装置的结构示意图。如图11所示,所述路由调用装置可以包括:
目标路由单元获取模块21,用于从预配置的路由单元组中,查找具备与待调用的目标路由地址匹配的映射结构的目标路由单元;所述路由单元组包括若干个按照上述的路由注册方法生成的路由单元;
目标中间件数组获取模块22,用于获取所述目标路由单元中的目标中间件数组;
路由实现模块23,用于按照预设的调用规则,调用所述目标中间件数组中的中间件,以实现所述目标路由地址对应的路由动作;所述预设的调用规则包括:在所述目标中间件数组包括多个中间件的情况下,按照先后顺序依次调用所述目标中间件数组中的各个中间件。
在本申请提供的一些实施例中,对于所述路由单元中的中间件数组,所述中间件数组中的每一个中间件被配置为:该中间件的输入参数由上下文对象提供,并且,该中间件中包含有用于调用所述中间件数组中的下一个中间件的调用函数next。
在上述的基础上,所述路由实现模块23按照预设的调用规则,调用所述目标中间件数组中的中间件的过程,可以包括:
依据预先创建的目标上下文对象,调用并执行所述目标中间件数组中的第一个中间件,将该中间件的执行结果写入所述目标上下文对象,并借由该中间件中的调用函数next,调用并执行所述目标中间件数组中的下一个中间件,直至调用完所述目标中间件数组中的各个中间件;
其中,所述目标上下文对象是在调用所述目标路由地址时创建的,且对应于所述目标中间件数组中的各个中间件的上下文对象,所述目标上下文对象中预先写有所述目标路由地址及其传入参数。
在本申请提供的一些实施例中,所述目标上下文对象中包含有:第一回调函数和第二回调函数;
所述第一回调函数用于:在所述目标中间件数组中的任一个所述中间件执行成功的情况下被调用,以在所述目标上下文对象中记录用于表征所述中间件执行成功的信息;所述第二回调函数用于:在所述目标中间件数组中的任一个所述中间件执行失败的情况下被调用,以在所述目标上下文对象中记录用于表征所述中间件执行失败的信息。
在本申请提供的一些实施例中,所述路由调用装置还包括缓存模块,用于在确定所述目标路由单元后,将所述目标路由单元写入缓存。
在上述的基础上,所述目标路由单元获取模块21用于:在从预配置的路由单元组中,查找具备与待调用的目标路由地址匹配的映射结构的目标路由单元之前,从所述缓存中查找具备与所述待调用的路由地址匹配的映射结构的目标路由单元,若查找未命中,执行从预配置的路由单元组中,查找具备与待调用的目标路由地址匹配的映射结构的目标路由单元的步骤;若查找命中,执行获取所述目标路由单元中的目标中间件数组的步骤。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间可以根据需要进行组合,且相同相似部分互相参见即可。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

Claims (9)

1.一种路由注册方法,其特征在于,包括:
获取待注册的路由注册地址;
配置所述待注册的路由注册地址对应的中间件数组,所述中间件数组包括一个或多个中间件,所述多个中间件用于:被依次调用以实现所述待注册的路由注册地址对应的路由动作,每一个所述中间件对应至少一个路由注册地址;
依据所述待注册的路由注册地址,生成映射结构,所述映射结构用于匹配所述待注册的路由注册地址对应的待调用的路由地址;
生成所述待注册的路由注册地址的路由单元,所述路由单元包括:所述待注册的路由注册地址、所述中间件数组和所述映射结构;
所述中间件的输入参数由上下文对象提供,所述上下文对象是在调用所述待调用的路由地址时创建的,且对应于所述中间件数组中的各个中间件的上下文对象;
所述上下文对象中包含有:第一回调函数和第二回调函数;
所述第一回调函数用于:在所述中间件执行成功的情况下被调用,以在所述上下文对象中记录用于表征所述中间件执行成功的信息;所述第二回调函数用于:在所述中间件执行失败的情况下被调用,以在所述上下文对象中记录用于表征所述中间件执行失败的信息。
2.根据权利要求1所述的路由注册方法,其特征在于,
所述中间件中包含有用于调用所述中间件数组中的下一个中间件的调用函数next,其中,在所述中间件为所述中间件数组中的最后一个中间件的情况下,所述中间件中的所述调用函数next的执行结果为空。
3.根据权利要求1-2中任一项所述的路由注册方法,其特征在于,所述待注册的路由注册地址包含有:协议、主机号、路径组分、路径参数名和查询参数;
所述依据所述待注册的路由注册地址,生成映射结构,包括:
生成所述待注册的路由注册地址对应的正则路径,所述正则路径由所述主机号、所述路径组分和所述路径参数名构成;
利用预设的第一正则表达式对所述正则路径进行处理,以提取所述正则路径中的全部的路径参数名,由提取到的路径参数名构成路径参数组;其中,所述预设的第一正则表达式为:“:[\w]+[^/]*”;
对于所述路径参数组中的每一个路径参数名,将所述正则路径中的所述路径参数名替换为预设的第二正则表达式,并在路径尾端拼接$,得到所述映射结构;其中,所述预设的第二正则表达式为:“([^/]+)”;
所述路由单元还包括:所述路径参数组。
4.一种路由注册装置,其特征在于,包括:
路由注册地址获取模块,用于获取待注册的路由注册地址;
中间件数组配置模块,用于配置所述待注册的路由注册地址对应的中间件数组,所述中间件数组包括一个或多个中间件,所述多个中间件用于:被依次调用以实现所述待注册的路由注册地址对应的路由动作,每一个所述中间件对应至少一个路由注册地址;
映射结构配置模块,用于依据所述待注册的路由注册地址,生成映射结构,所述映射结构用于匹配所述待注册的路由注册地址对应的待调用的路由地址;
路由单元生成模块,用于生成所述待注册的路由注册地址的路由单元,所述路由单元包括:所述待注册的路由注册地址、所述中间件数组和所述映射结构;
所述中间件的输入参数由上下文对象提供,所述上下文对象是在调用所述待调用的路由地址时创建的,且对应于所述中间件数组中的各个中间件的上下文对象;
所述上下文对象中包含有:第一回调函数和第二回调函数;
所述第一回调函数用于:在所述中间件执行成功的情况下被调用,以在所述上下文对象中记录用于表征所述中间件执行成功的信息;所述第二回调函数用于:在所述中间件执行失败的情况下被调用,以在所述上下文对象中记录用于表征所述中间件执行失败的信息。
5.一种路由调用方法,其特征在于,包括:
从预配置的路由单元组中,查找具备与待调用的目标路由地址匹配的映射结构的目标路由单元;所述路由单元组包括若干个按照如权利要求1所述的路由注册方法生成的路由单元;
获取所述目标路由单元中的目标中间件数组;
按照预设的调用规则,调用所述目标中间件数组中的中间件,以实现所述目标路由地址对应的路由动作;所述预设的调用规则包括:在所述目标中间件数组包括多个中间件的情况下,按照先后顺序依次调用所述目标中间件数组中的各个中间件。
6.根据权利要求5所述的路由调用方法,其特征在于,对于所述路由单元中的中间件数组,所述中间件数组中的每一个中间件被配置为:该中间件的输入参数由上下文对象提供,并且,该中间件中包含有用于调用所述中间件数组中的下一个中间件的调用函数next;
所述按照预设的调用规则,调用所述目标中间件数组中的中间件,包括:
依据预先创建的目标上下文对象,调用并执行所述目标中间件数组中的第一个中间件,将该中间件的执行结果写入所述目标上下文对象,并借由该中间件中的调用函数next,调用并执行所述目标中间件数组中的下一个中间件,直至调用完所述目标中间件数组中的各个中间件;
其中,所述目标上下文对象是在调用所述目标路由地址时创建的,且对应于所述目标中间件数组中的各个中间件的上下文对象,所述目标上下文对象中预先写有所述目标路由地址及其传入参数。
7.根据权利要求6所述的路由调用方法,其特征在于,所述目标上下文对象中包含有:第一回调函数和第二回调函数;
所述第一回调函数用于:在所述目标中间件数组中的任一个所述中间件执行成功的情况下被调用,以在所述目标上下文对象中记录用于表征所述中间件执行成功的信息;所述第二回调函数用于:在所述目标中间件数组中的任一个所述中间件执行失败的情况下被调用,以在所述目标上下文对象中记录用于表征所述中间件执行失败的信息。
8.根据权利要求5-7中任一项所述的路由调用方法,其特征在于,在确定所述目标路由单元后,所述方法还包括:将所述目标路由单元写入缓存;
在从预配置的路由单元组中,查找具备与待调用的目标路由地址匹配的映射结构的目标路由单元之前,所述方法还包括:
从所述缓存中查找具备与所述待调用的路由地址匹配的映射结构的目标路由单元,若查找未命中,执行从预配置的路由单元组中,查找具备与待调用的目标路由地址匹配的映射结构的目标路由单元的步骤;若查找命中,执行获取所述目标路由单元中的目标中间件数组的步骤。
9.一种路由调用装置,其特征在于,包括:
目标路由单元获取模块,用于从预配置的路由单元组中,查找具备与待调用的目标路由地址匹配的映射结构的目标路由单元;所述路由单元组包括若干个按照如权利要求1所述的路由注册方法生成的路由单元;
目标中间件数组获取模块,用于获取所述目标路由单元中的目标中间件数组;
路由实现模块,用于按照预设的调用规则,调用所述目标中间件数组中的中间件,以实现所述目标路由地址对应的路由动作;所述预设的调用规则包括:在所述目标中间件数组包括多个中间件的情况下,按照先后顺序依次调用所述目标中间件数组中的各个中间件;
所述中间件的输入参数由上下文对象提供,所述上下文对象是在调用所述待调用的路由地址时创建的,且对应于所述中间件数组中的各个中间件的上下文对象;
所述上下文对象中包含有:第一回调函数和第二回调函数;
所述第一回调函数用于:在所述中间件执行成功的情况下被调用,以在所述上下文对象中记录用于表征所述中间件执行成功的信息;所述第二回调函数用于:在所述中间件执行失败的情况下被调用,以在所述上下文对象中记录用于表征所述中间件执行失败的信息。
CN202311382057.8A 2023-10-24 2023-10-24 一种路由注册、路由调用方法及装置 Active CN117118905B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311382057.8A CN117118905B (zh) 2023-10-24 2023-10-24 一种路由注册、路由调用方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311382057.8A CN117118905B (zh) 2023-10-24 2023-10-24 一种路由注册、路由调用方法及装置

Publications (2)

Publication Number Publication Date
CN117118905A CN117118905A (zh) 2023-11-24
CN117118905B true CN117118905B (zh) 2024-01-09

Family

ID=88797000

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311382057.8A Active CN117118905B (zh) 2023-10-24 2023-10-24 一种路由注册、路由调用方法及装置

Country Status (1)

Country Link
CN (1) CN117118905B (zh)

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106445700A (zh) * 2016-09-20 2017-02-22 杭州华三通信技术有限公司 一种url匹配方法及装置
CN107707614A (zh) * 2017-08-16 2018-02-16 深圳市丰巢科技有限公司 基于统跳协议的app路由实现方法、设备及存储介质
CN111078311A (zh) * 2019-11-19 2020-04-28 北京达佳互联信息技术有限公司 中间件控制运行方法、系统
CN111371682A (zh) * 2020-02-21 2020-07-03 中国科学技术大学苏州研究院 基于多层标签的中间件网络中可扩展性路由方法
CN112235357A (zh) * 2020-09-23 2021-01-15 建信金融科技有限责任公司 跨平台应用开发系统
CN113296972A (zh) * 2020-07-20 2021-08-24 阿里巴巴集团控股有限公司 一种信息的注册方法、计算设备及存储介质

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US12093758B2 (en) * 2019-03-07 2024-09-17 International Business Machines Corporation Middleware in web framework
US20220222129A1 (en) * 2021-01-12 2022-07-14 GM Global Technology Operations LLC System for parallel processing middleware node application algorithms using threads

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106445700A (zh) * 2016-09-20 2017-02-22 杭州华三通信技术有限公司 一种url匹配方法及装置
CN107707614A (zh) * 2017-08-16 2018-02-16 深圳市丰巢科技有限公司 基于统跳协议的app路由实现方法、设备及存储介质
CN111078311A (zh) * 2019-11-19 2020-04-28 北京达佳互联信息技术有限公司 中间件控制运行方法、系统
CN111371682A (zh) * 2020-02-21 2020-07-03 中国科学技术大学苏州研究院 基于多层标签的中间件网络中可扩展性路由方法
CN113296972A (zh) * 2020-07-20 2021-08-24 阿里巴巴集团控股有限公司 一种信息的注册方法、计算设备及存储介质
CN112235357A (zh) * 2020-09-23 2021-01-15 建信金融科技有限责任公司 跨平台应用开发系统

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
【Node.js】详细记录express路由和中间件以及qs中间件的 使用_node qs-CSDN博客;CSDN博客;https://blog.csdn.net/weixin_44899940/article/details/129164812;第1-13页 *
博主花神.【Node.js】详细记录express路由和中间件以及qs中间件的 使用_node qs-CSDN博客.https://blog.csdn.net/weixin_44899940/article/details/129164812.2023,第1-13页. *

Also Published As

Publication number Publication date
CN117118905A (zh) 2023-11-24

Similar Documents

Publication Publication Date Title
US7480658B2 (en) Distributed database system and method having nodes co-ordinated in a decentralized manner
CN111338637B (zh) 一种代码生成方法及装置
US7873650B1 (en) System and method for distributing data in a parallel processing system
CN111988171B (zh) 基于RESTful风格请求调用SOAP Web服务的方法、代理服务器及系统
CN107391357A (zh) 应用崩溃重现方法、装置及移动终端
CN111813914B (zh) 基于字典树的问答方法、装置、识别设备及可读存储介质
CN110781183A (zh) Hive数据库中增量数据的处理方法、装置以及计算机设备
US8015195B2 (en) Modifying entry names in directory server
US20060229927A1 (en) Resolution of group membership for resources
CN111443901A (zh) 一种基于Java反射的业务扩展方法及装置
CN112182174A (zh) 业务问答知识查询方法、装置、计算机设备和存储介质
CN117118905B (zh) 一种路由注册、路由调用方法及装置
US9619825B1 (en) Management of distribution lists
CN114610598A (zh) 测试方法、装置、电子设备及计算机可读存储介质
CN116911804A (zh) 一种基于设备自适应的流程设计测试方法
US20140379820A1 (en) Email address and telephone number unification systems and methods
CN115544132A (zh) 数据导入方法、系统及电子设备
CN115756598A (zh) 应用于低代码平台的组件检测方法、系统及装置
CN113992664B (zh) 一种集群通信的方法、相关装置及存储介质
US7693826B1 (en) System and method for pre-compiling a query and pre-keying a database system
US8266234B1 (en) System and method for enhancing system reliability using multiple channels and multicast
CN103222252A (zh) 用于选择性启动通信的服务访问设备、方法、计算机程序及计算机程序产品
CN115567444B (zh) 一种控制器路由地址查找调用方法及系统
US7801911B1 (en) System and method for using activity identifications in a database system
CN118433309B (zh) 呼叫信息处理方法、数据应答装置以及呼叫信息处理系统

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant