一种对Dio网络请求进行监控的方法和装置转让专利

申请号 : CN202110887717.2

文献号 : CN113765740B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 郑秀群梁少泽

申请人 : 网宿科技股份有限公司

摘要 :

本发明公开了一种对Dio网络请求进行监控的方法,所述方法包括:在Flutter应用层中嵌入AspectD实现层,以使得当Flutter应用层基于第一实现接口发起目标网络请求时,AspectD实现层生成第一钩子函数对所述第一实现接口进行挂钩处理,以获取dio实例;当Flutter应用层调用所述dio实例,并基于第二实现接口向外发送所述目标网络请求时,AspectD实现层生成第二钩子函数对所述第二实现接口进行挂钩处理,并通过所述第二钩子函数标记所述目标网络请求的发送时间戳和响应时间戳。本申请提供的技术方案,可以在不修改应用本身任何代码的情况下,实现对Flutter Dio网络请求的监控。

权利要求 :

1.一种对Dio网络请求进行监控的方法,其特征在于,所述方法应用于客户端中,所述客户端构建有Flutter应用层,所述方法包括:在所述Flutter应用层中嵌入AspectD实现层,以使得当所述Flutter应用层基于第一实现接口发起目标网络请求时,所述AspectD实现层生成第一钩子函数对所述第一实现接口进行挂钩处理,以获取dio实例;其中,在所述Flutter应用层中嵌入AspectD实现层包括:将AspectD源码注入Flutter框架中,以在所述Flutter框架中创建所述AspectD实现层;在所述AspectD实现层中添加所述第一实现接口和所述第二实现接口的依赖项,以使得所述AspectD实现层对所述第一实现接口和所述第二实现接口进行埋点设置;

当所述Flutter应用层调用所述dio实例,并基于第二实现接口向外发送所述目标网络请求时,所述AspectD实现层生成第二钩子函数对所述第二实现接口进行挂钩处理,并通过所述第二钩子函数标记所述目标网络请求的发送时间戳和响应时间戳,以监控所述目标网络请求的发送时长和响应时长。

2.根据权利要求1所述的方法,其特征在于,当所述AspectD实现层获取dio实例后,所述方法还包括:设置拦截器,以监控所述目标网络请求和目标响应消息,其中,所述目标响应消息与所述目标网络请求相对应;

释放所述第一实现接口,以使得所述第一实现接口调用所述第二实现接口向外发送所述目标网络请求。

3.根据权利要求1所述的方法,其特征在于,所述AspectD实现层通过所述第二钩子函数标记所述目标网络请求的发送时间戳包括:当所述目标网络请求完成封装,且未发送所述目标网络请求的请求头部信息和请求体信息时,所述AspectD实现层通过所述第二钩子函数标记第一时间戳;

在所述第二实现接口向外发送已完成封装的目标网络请求时,所述AspectD实现层通过所述第二钩子函数标记第二时间戳。

4.根据权利要求3所述的方法,其特征在于,所述AspectD实现层通过所述第二钩子函数标记所述目标网络请求的响应时间戳包括:在所述第二实现接口接收到所述目标响应消息前,所述AspectD实现层通过所述第二钩子函数标记一个时间点记为第三时间戳;

当所述第二实现接口接收到所述目标响应消息后,所述AspectD实现层通过所述第二钩子函数标记一个时间点记为第四时间戳。

5.根据权利要求4所述的方法,其特征在于,监控所述目标网络请求的发送时长和响应时长包括:基于所述第一时间戳和所述第二时间戳之间的差值,计算所述目标网络请求的发送时长;

基于所述第三时间戳和所述第四时间戳之间的差值,计算所述目标网络请求的响应时长。

6.根据权利要求2所述的方法,其特征在于,监控所述目标网络请求和目标响应消息包括:拦截所述第二实现接口,以获取所述目标网络请求和所述目标响应消息;

解析所述目标网络请求和所述目标响应消息,以获取所述目标网络请求的请求头部信息和请求体信息,以及所述目标响应消息的响应头部信息和响应体信息。

7.一种对Dio网络请求进行监控的装置,其特征在于,所述装置应用于客户端中,所述客户端构建有Flutter应用层,所述装置包括:AspectD嵌入模块,用于在所述Flutter应用层中嵌入AspectD实现层;具体用于:将AspectD源码注入Flutter框架中,以在所述Flutter框架中创建所述AspectD实现层;

AspectD实现层模块,用于添加所述第一实现接口和所述第二实现接口的依赖项,以对所述第一实现接口和所述第二实现接口进行埋点设置;

AspectD实现层模块,还用于当所述Flutter应用层基于第一实现接口发起目标网络请求时,生成第一钩子函数对所述第一实现接口进行挂钩处理,以获取dio实例,以及当所述Flutter应用层调用所述dio实例,并基于第二实现接口向外发送所述目标网络请求时,生成第二钩子函数对所述第二实现接口进行挂钩处理,并通过所述第二钩子函数标记所述目标网络请求的发送时间戳和响应时间戳;

网络请求监控模块,用于基于所述发送时间戳和所述响应时间戳,监控所述目标网络请求的发送时长和响应时长。

8.根据权利要求7所述的装置,其特征在于,所述装置还包括:

拦截器设置模块,用于设置拦截器,以监控所述目标网络请求和目标响应消息,其中,所述目标响应消息与所述目标网络请求相对应;

接口释放模块,用于释放所述第一实现接口,以使得所述第一实现接口调用所述第二实现接口向外发送所述目标网络请求。

9.一种对Dio网络请求进行监控的装置,其特征在于,所述装置包括存储器和处理器,所述存储器用于存储计算机程序,当所述计算机程序被所述处理器执行时,实现如权利要求1至6中任一权利要求所述的方法。

说明书 :

一种对Dio网络请求进行监控的方法和装置

技术领域

[0001] 本发明涉及互联网技术领域,特别涉及一种对Dio网络请求进行监控的方法和装置。

背景技术

[0002] Flutter是一款移动UI框架,利用Flutter框架可以快速在IOS和Android系统上构建高质量的原生用户界面。在Flutter应用开发过程中,势必需要用到网络请求。Dio是Flutter插件库中的一款网络请求插件,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时、自定义适配器等操作,因此开发者经常使用Dio网络请求插件对网络请求进行封装。
[0003] 当一个产品开发完毕交付到用户手中后,开发者为了更好的了解用户的使用情况、数据的加载情况,通常需要对网络请求的发送时长、数据的加载时间等网络情况进行监控。然而,目前并不存在对Flutter Dio网络请求进行监控的方案。
[0004] 鉴于此,有必要提供一种对Dio网络请求进行监控的方法和装置以解决上述不足。

发明内容

[0005] 本申请的目的在于提供一种对Dio网络请求进行监控的方法和装置,可以在不修改应用本身任何代码的情况下,实现对Flutter Dio网络请求的监控。
[0006] 为实现上述目的,本申请一方面提供一种对Dio网络请求进行监控的方法,所述方法应用于客户端中,所述客户端构建有Flutter应用层和AspectD实现层,所述方法包括:当所述Flutter应用层基于第一实现接口发起目标网络请求时,所述AspectD实现层生成第一钩子函数对所述第一实现接口进行挂钩处理,以获取dio实例;当所述Flutter应用层调用所述dio实例,并基于第二实现接口向外发送所述目标网络请求时,所述AspectD实现层生成第二钩子函数对所述第二实现接口进行挂钩处理,并通过所述第二钩子函数标记所述目标网络请求的发送时间戳和响应时间戳,以监控所述目标网络请求的发送时长和响应时长。
[0007] 为实现上述目的,本申请另一方面还提供一种对Dio网络请求进行监控的装置,所述装置应用于客户端中,所述客户端构建有Flutter应用层,所述装置包括:AspectD嵌入模块,用于在所述Flutter应用层中嵌入AspectD实现层;AspectD实现层模块,用于当所述Flutter应用层基于第一实现接口发起目标网络请求时,生成第一钩子函数对所述第一实现接口进行挂钩处理,以获取dio实例,以及当所述Flutter应用层调用所述dio实例,并基于第二实现接口向外发送所述目标网络请求时,生成第二钩子函数对所述第二实现接口进行挂钩处理,并通过所述第二钩子函数标记所述目标网络请求的发送时间戳和响应时间戳;网络请求监控模块,用于基于所述发送时间戳和所述响应时间戳,监控所述目标网络请求的发送时长和响应时长。
[0008] 为实现上述目的,本申请另一方面还提供一种对Dio网络请求进行监控的装置,所述装置包括存储器和处理器,所述存储器用于存储计算机程序,当所述计算机程序被所述处理器执行时,实现上述对Dio网络请求进行监控的方法。
[0009] 由此可见,本申请提供的技术方案,首先在Flutter框架中引入AspectD实现层,然后利用AspectD实现层对Flutter应用层进行挂钩处理,以获取dio实例,这样当Flutter应用层调用dio实例对网络请求进行封装时,AspectD实现层便可以对网络请求的发送时长、数据的加载时间等网络情况进行监控,并且当Flutter应用层接收到对应的响应信息时,AspectD实现层同样可以对网络请求的响应时长进行监控。如此,通过利用AspectD实现层对Dio网络请求底层库中的特定方法和特定位置进行无痕埋点,便可以在不对Flutter应用代码进行任何修改的情况下,获取到Dio网络请求的发送时长、响应时长等数据指标。

附图说明

[0010] 为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0011] 图1是本申请实施方式中客户端软件架构示意图;
[0012] 图2本申请实施方式中对Dio网络请求进行监控的方法的流程图;
[0013] 图3是本申请实施方式中对Dio网络请求进行监控的装置的功能模块示意图;
[0014] 图4是本申请实施方式中对Dio网络请求进行监控的装置的结构示意图。

具体实施方式

[0015] 为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
[0016] Flutter是一款移动UI框架,其使用Dart语言开发,Dart语言可以方便地被编译成不同平台的本地代码,因此利用Flutter框架可以快速在IOS和Android系统上构建高质量的原生用户界面,这就使得开发者越来越多的使用Flutter框架来重构或新建其产品。
[0017] 在Flutter应用开发过程中,势必需要用到网络请求,而Dio是Flutter插件库中的一款网络请求插件,Dio支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时、自定义适配器等操作,因此在Flutter框架下开发者经常使用Dio网络请求插件对网络请求进行封装。
[0018] 当一个产品开发完毕交付到用户手中后,开发者为了更好的了解用户的使用情况、数据的加载情况,通常需要对网络请求的发送时长、数据的加载时间等网络情况进行监控。然而,目前并不存在对Flutter Dio网络请求进行监控的方案,这就使得开发者无法对Flutter应用进行针对性的优化。
[0019] 因此,如何对Flutter Dio网络请求进行监控,以获取Dio网络请求的发送时长、响应时长等数据指标,便成为本领域亟待解决的问题。
[0020] 本申请提供的技术方案可以解决上述不足。
[0021] 为便于理解本申请中涉及到的AspectD内容,下面对其进行简要介绍。
[0022] AspectD是针对Flutter的AOP(Aspect Oriented Programming,面向切面编程)开源库,用于解决AOP for Flutter的问题,可以在不修改Flutter源代码的情况下动态统一地添加功能。
[0023] Flutter在编译时,首先由编译前端将dart代码转换为中间文件app.dill,然后在debug模式下,将app.dill转换为kernel_blob.bin,在release模式下,app.dill被转换为framework。AspectD就是对app.dill进行修改,从而实现在Flutter中应用AOP。具体的,AspectD通过编译aop.dart生成中间产物,使得dill文件中既包含原始项目代码,也包含AOP代码,然后通过Dill变换对dill文件进行操作,提取出哪些库/类/方法需要添加怎样的AOP代码,从而在不修改Flutter源代码的情况下,对Flutter应用层添加相应的功能。
[0024] 请一并参阅图1和图2,图1为本申请实施方式中客户端软件架构示意图,图2为本申请实施方式中对Dio网络请求进行监控的方法的流程图。
[0025] 本申请所述对Dio网络请求进行监控的方法应用于客户端中,该客户端构建有Flutter应用层,从而使得该客户端可以运行基于Flutter框架开发的应用程序。同时,在该客户端中,Flutter应用层使用Dio网络请求插件对网络请求进行封装。需要特别指出的是,客户端的具体形式包括但不限于手机、平板电脑、笔记本电脑等终端设备。对Dio网络请求进行监控的方法可以包括以下步骤。
[0026] S101:在所述Flutter应用层中嵌入AspectD实现层,以使得当所述Flutter应用层基于第一实现接口发起目标网络请求时,所述AspectD实现层生成第一钩子函数对所述第一实现接口进行挂钩处理,以获取dio实例。
[0027] 在本实施方式中,开发者可以根据实际需要(例如对网络请求的发送时长和响应时长进行监控),预先设置AspectD实现层针对Flutter应用层的切入点,并将设置完毕的AspectD实现层嵌入Flutter应用层中,从而利用AspectD实现层监控Dio网络请求。
[0028] 在一个实施方式中,在Flutter应用层中嵌入AspectD实现层可以通过如下方式实现:
[0029] 首先,将AspectD源码注入Flutter框架中,以在所述Flutter框架中创建所述AspectD实现层;
[0030] 然后,在所述AspectD实现层中添加第一实现接口和第二实现接口的依赖项,以使得所述AspectD实现层对所述第一实现接口和所述第二实现接口进行埋点设置。
[0031] 在实际应用中,开发者首先可以下载Flutter源码和AspectD源码,然后设置flutter镜像、本地flutter源码地址、flutter bin目录、dart bin目录等环境变量,之后切换到Flutter的git目录,将AspectD源码中的git patch文件合并到Flutter源码工程中,从而将AspectD源码注入Flutter框架中,以完成AspectD环境的搭建。之后,开发者可以删除原有flutter sdk目录下的缓存文件(即删除原来的Flutter编译工具),并重新构建新的Flutter编译工具,然后利用flutter命令创建一个新的Flutter包(称为aspectd_impl),这样,开发者就完成了在Flutter框架中创建AspectD实现层的工作。
[0032] 在完成AspectD实现层的创建工作后,开发者还需要确定AspectD实现层针对Flutter应用层的切入点,以完成相关的操作。下文以开发者对Dio网络请求进行监控为例,对如何确定AspectD实现层的切入点进行说明。
[0033] 在实际应用中,Flutter应用层可以使用Dio网络请求插件发起一条网络请求,具体的,Flutter应用层可以使用Dio网络请求插件中的get或者post方法发起网络请求。当Flutter应用层利用Dio网络请求插件发起目标网络请求时,Dio网络请求插件将会创建dio_sendRequest_func接口(称为第一实现接口),并利用上述第一实现接口创建dio实例,最终Flutter应用层可以通过该dio实例发起网络请求(称为目标网络请求)。
[0034] 当Flutter应用层基于上述第一实现接口,通过上述dio实例发起目标网络请求时,Dio网络请求插件可以通过fetch方法获取目标网络请求的请求头部信息和请求体信息,然后对目标网络请求进行封装。当Dio网络请求插件完成目标网络请求的封装后,Dio网络请求插件可以通过相应的接口向外网发送封装好的目标网络请求。具体的,Dio网络请求插件可以创建dio_fetch_func接口(称为第二实现接口),然后利用该接口向外发送封装好的目标网络请求。因此,如果开发者需要对Dio网络请求进行监控,开发者可以将上述第一实现接口和上述第二实现接口作为AspectD实现层的切入点。
[0035] 在实际应用中,当开发者完成AspectD实现层的创建工作后,其可以在aspectd_impl包中添加AspectD&example依赖项,从而对Flutt的相关库进行关联,其中,AspectD为开发者下载的AspectD源码,example泛指需要进行监控的Flutter APP应用(例如Dio网络请求插件)。当开发者在aspectd_impl包中添加AspectD&example依赖项后,AspectD实现层便可以在运行时从aspectd_impl包中获取相应的依赖项,以实现相应的功能。针对Dio网络请求监控功能,开发者可以将上述第一实现接口和上述第二实现接口的依赖项添加进aspectd_impl包中,从而使得AspectD实现层可以对上述第一实现接口和上述第二实现接口进行埋点设置。
[0036] 在一个实施方式中,当Flutter应用层基于第一实现接口发起目标网络请求时,AspectD实现层可以生成第一钩子函数对上述第一实现接口进行挂钩处理,以获取dio实例。在实际应用中,由于开发者已经在aspectd_impl包中添加了上述第一实现接口的依赖项,因此AspectD实现层在运行时可以对第一实现接口(即dio_sendRequest_func接口)进行监控。具体的,AspectD实现层可以利用方法挂钩技术(hook)对第一实现接口进行挂钩处理。AspectD实现层首先可以在aspectd_impl包中生成hook_dio_sendRequest_func函数(称为第一钩子函数),并将第一钩子函数与第一实现接口进行关联。
[0037] 由于Dio网络请求插件在创建第一实现接口时,系统会生成一个消息通知,该消息通知用于表示第一实现接口已经建立,同时系统还会将该消息通知传递到AspectD实现层,这样当AspectD实现层在接收到该消息通知后,AspectD实现层便可以调用第一钩子函数,从而实现第一钩子函数对第一实现接口的挂钩。当第一钩子函数对第一实现接口进行挂钩处理后,第一钩子函数便可以接管第一实现接口。这样,当Flutter应用层通过上述第一实现接口创建dio实例时,AspectD实现层便可以获取到Flutter应用层生成的dio实例。
[0038] 在一个实施方式中,当AspectD实现层获取到Flutter应用层生成的dio实例后,AspectD实现层还可以设置拦截器,以通过拦截器监控目标网络请求和目标响应消息,其中,目标响应消息与目标网络请求相对应,亦即目标响应消息为响应端在接收到目标网络请求后,向客户端反馈的响应信息。在实际应用中,AspectD实现层可以创建一个拦截器类来覆盖onRequest、onError、onResponse方法,以在Flutter应用层发送请求之前、请求失败时、接收响应之前做一些预处理,其实现方式可以通过如下代码实现:
[0039]
[0040]
[0041] 由于第一实现接口和第二实现接口属于继承关系,因此,当AspectD实现层对拦截器进行设置后,AspectD实现层需要释放第一实现接口,从而使得第一实现接口可以调用第二实现接口向外发送目标网络请求。具体的,AspectD实现层可以卸载第一钩子函数,以撤销第一钩子函数与第一调用接口的挂钩,这样,第一实现接口将会被释放,从而使得Flutter应用层可以继续通过原有的网络请求发送流程(即通过第一实现接口调用第二实现接口)向外发送目标网络请求。
[0042] 需要特别指出的是,如果Flutter应用层配置有代理通道,即客户端需要经过代理服务器向响应端发送目标网络请求,那么AspectD实现层在获取到Flutter应用层生成的dio实例后,AspectD实现层还需要对dio实例设置代理,从而使得目标网络请求在从客户端发出后,目标网络请求可以首先到达代理服务器,然后再经代理服务器中转到达响应端。通过在客户端和响应端之间设置代理服务器,我们可以引入CDN网络来提高用户访问网站的响应速度,从而解决因为链路问题而导致的数据加载缓慢的问题。
[0043] 需要特别指出的是,本申请以对Dio网络请求进行监控为例进行说明只是示意性的,基于本申请的思想,本领域的技术人员也可以对其它Flutter项目进行监控。在对其它Flutter项目进行监控时,本领域的技术人员只需根据需要确定新的AspectD实现层切入点即可。
[0044] S102:当所述Flutter应用层调用所述dio实例,并基于第二实现接口向外发送所述目标网络请求时,所述AspectD实现层生成第二钩子函数对所述第二实现接口进行挂钩处理,并通过所述第二钩子函数标记所述目标网络请求的发送时间戳和响应时间戳,以监控所述目标网络请求的发送时长和响应时长。
[0045] 在本实施方式中,当第一实现接口创建dio实例后,Flutter应用层便可以调用上述dio实例对目标网络请求进行封装,并利用第二实现接口(即dio_fetch_func接口)向外发送封装好的目标网络请求。在实际应用中,由于开发者已经在aspectd_impl包中添加了上述第二实现接口的依赖项,因此AspectD实现层在运行时可以对第二实现接口进行监控。具体的,AspectD实现层可以利用方法挂钩技术(hook)对第二实现接口进行挂钩处理。
AspectD实现层首先可以在aspectd_impl包中生成hook_fetch_func函数(称为第二钩子函数),并将第二钩子函数与第二实现接口进行关联。
[0046] 由于Dio网络请求插件在创建第二实现接口时,系统会生成一个消息通知,该消息通知用于表示第二实现接口已经建立,同时系统还会将该消息通知传递到AspectD实现层,这样当AspectD实现层在接收到该消息通知后,AspectD实现层便可以调用第二钩子函数,从而实现第二钩子函数对第二实现接口的挂钩。当第二钩子函数对第二实现接口进行挂钩处理后,第二钩子函数便可以接管第二实现接口。这样,当Flutter应用层通过第二实现接口向外发送目标网络请求时,AspectD实现层便可以利用第二钩子函数标记目标网络请求的发送时间戳。相应的,当Flutter应用层通过第二实现接口接收到响应端反馈的目标响应消息时,AspectD实现层便可以利用第二钩子函数标记目标网络请求的响应时间戳。AspectD实现层在标记完目标网络请求的发送时间戳和响应时间戳后,便可以将上述时间戳上报至监控端,从而使得开发者可以监控目标网络请求的发送时长和响应时长。
[0047] 在一个实施方式中,AspectD实现层通过第二钩子函数标记目标网络请求的发送时间戳包括以下步骤:
[0048] 首先,在Flutter应用层调用dio实例发送目标网络请求之前,AspectD实现层通过第二钩子函数标记第一时间戳;
[0049] 然后,在Flutter应用层调用dio实例完成目标网络请求的发送之后,AspectD实现层通过第二钩子函数标记第二时间戳。
[0050] 在实际应用中,当Dio网络请求插件完成目标网络请求的封装,而尚未发送目标网络请求的请求头部信息和请求体信息时(即Flutter应用层调用dio实例发送目标网络请求之前),AspectD实现层可以通过第二钩子函数标记第一时间戳。当Dio网络请求插件利用第二实现接口向外发送封装好的目标网络请求时(即Flutter应用层调用dio实例完成目标网络请求的发送之后),AspectD实现层可以通过第二钩子函数标记第二时间戳。上述第一时间戳和上述第二时间戳即为目标网络请求的发送时间戳。
[0051] 当AspectD实现层将上述第一时间戳和上述第二时间戳上报至监控端后,开发者便可以根据第一时间戳和第二时间戳之间的差值,计算出目标网络请求的发送时长,进而判断是否需要对Flutter应用或者网络进行优化。
[0052] 在一个实施方式中,AspectD实现层通过第二钩子函数标记目标网络请求的响应时间戳包括以下步骤:
[0053] 首先,在第二实现接口接收到目标响应消息前,AspectD实现层通过第二钩子函数标记第三时间戳;
[0054] 当第二实现接口接收到目标响应消息后,AspectD实现层通过第二钩子函数标记第四时间戳。
[0055] 在实际应用中,当目标网络请求发出外网后,目标网络请求指向的源站(即响应端)将接收到目标网络请求。当响应端接收到目标网络请求后,响应端会向客户端反馈响应信息(即目标响应消息),而基于Dio网络请求插件的特点,目标响应消息将由dio_fetch_func接口负责接收,即目标响应消息会被传递至第二实现接口。因此,AspectD实现层可以利用第二钩子函数对目标网络请求的响应时间进行监控。具体的,第二钩子函数可以在第二实现接口接收到目标响应消息之前标记一个时间点(记为第三时间戳),并在第二实现接口接收到目标响应消息之后标记一个时间点(记为第四时间戳)。上述第三时间戳和上述第四时间戳即为目标网络请求的响应时间戳。
[0056] 相应的,当AspectD实现层将上述第三时间戳和上述第四时间戳上报至监控端后,开发者便可以根据第三时间戳和第四时间戳之间的差值,计算出目标网络请求的响应时长,进而判断是否需要对网络或者响应端进行优化。
[0057] 在一个实施方式中,拦截器监控目标网络请求和目标响应消息可以通过如下方式实现:
[0058] 首先,拦截第二实现接口,以获取目标网络请求和目标响应消息;
[0059] 然后,解析目标网络请求和目标响应消息,以获取目标网络请求的请求头部信息和请求体信息,以及目标响应消息的响应头部信息和响应体信息。
[0060] 在实际应用中,当AspectD实现层创建拦截器类以覆盖onRequest、onError、onResponse方法后,拦截器便可以对第二实现接口进行拦截,这样当Dio网络请求插件利用第二实现接口向外发送封装好的目标网络请求时,拦截器便可以获取到上述封装好的目标网络请求。当拦截器获取到上述目标网络请求后,拦截器可以对目标网络请求进行解析,从而获取目标网络请求的请求头部信息和请求体信息。进一步的,当拦截器获取到目标网络请求的请求头部信息和请求体信息后,拦截器可以将上述请求头部信息和请求体信息上报至监控端,从而使得开发者可以对目标网络请求进行分析,以实现对目标网络请求的监控。例如,拦截器可以对目标网络请求进行解析,从而获取到请求头部信息中存放的cookie信息、token信息、host信息等,以及请求体信息中存放的post参数和参数数据等信息,之后,拦截器可以将获取到的上述信息上报至监控端。当拦截器完成目标网络请求的请求头部信息和请求体信息的上报工作后,拦截器将向Flutter应用层返回上述目标网络请求,从而使得Flutter应用层可以继续向外发送目标网络请求。
[0061] 相应的,当第二实现接口接收到响应端反馈的目标响应消息后,拦截器同样可以获取到上述目标响应消息,之后,拦截器可以对上述目标响应消息进行解析,从而获取目标响应消息的响应头部信息和响应体信息。进一步的,当拦截器获取到目标响应消息的响应头部信息和响应体信息后,拦截器可以将上述响应头部信息和响应体信息上报至监控端,从而使得开发者可以对目标响应消息进行分析,以实现对目标响应消息的监控。
[0062] 需要特别指出的是,当拦截器完成目标响应消息的响应头部信息和响应体信息的上报工作后,拦截器可以将上述目标响应消息返回给Flutter应用层,这样,Flutter应用层就可以在客户端正常展示目标响应消息。
[0063] 请参阅图3,本申请还提供一种对Dio网络请求进行监控的装置,所述装置应用于客户端中,所述客户端构建有Flutter应用层,所述装置包括:
[0064] AspectD嵌入模块,用于在所述Flutter应用层中嵌入AspectD实现层;
[0065] AspectD实现层模块,用于当所述Flutter应用层基于第一实现接口发起目标网络请求时,生成第一钩子函数对所述第一实现接口进行挂钩处理,以获取dio实例,以及当所述Flutter应用层调用所述dio实例,并基于第二实现接口向外发送所述目标网络请求时,生成第二钩子函数对所述第二实现接口进行挂钩处理,并通过所述第二钩子函数标记所述目标网络请求的发送时间戳和响应时间戳;
[0066] 网络请求监控模块,用于基于所述发送时间戳和所述响应时间戳,监控所述目标网络请求的发送时长和响应时长。
[0067] 在一个实施方式中,AspectD嵌入模块,还用于将AspectD源码注入Flutter框架中,以在所述Flutter框架中创建所述AspectD实现层;
[0068] AspectD实现层模块,还用于添加所述第一实现接口和所述第二实现接口的依赖项,以对所述第一实现接口和所述第二实现接口进行埋点设置。
[0069] 在一个实施方式中,所述装置还包括:
[0070] 拦截器设置模块,用于设置拦截器,以监控所述目标网络请求和目标响应消息,其中,所述目标响应消息与所述目标网络请求相对应;
[0071] 接口释放模块,用于释放所述第一实现接口,以使得所述第一实现接口调用所述第二实现接口向外发送所述目标网络请求。
[0072] 在一个实施方式中,通过所述第二钩子函数标记所述目标网络请求的发送时间戳包括:
[0073] 在所述Flutter应用层调用所述dio实例发送所述目标网络请求之前,通过所述第二钩子函数标记第一时间戳;
[0074] 在所述Flutter应用层调用所述dio实例完成所述目标网络请求的发送之后,通过所述第二钩子函数标记第二时间戳。
[0075] 在一个实施方式中,通过所述第二钩子函数标记所述目标网络请求的响应时间戳包括:
[0076] 在所述第二实现接口接收到所述目标响应消息前,通过所述第二钩子函数标记第三时间戳;
[0077] 当所述第二实现接口接收到所述目标响应消息后,通过所述第二钩子函数标记第四时间戳。
[0078] 在一个实施方式中,监控所述目标网络请求的发送时长和响应时长包括:
[0079] 基于所述第一时间戳和所述第二时间戳,计算所述目标网络请求的发送时长;
[0080] 基于所述第三时间戳和所述第四时间戳,计算所述目标网络请求的响应时长。
[0081] 在一个实施方式中,监控所述目标网络请求和目标响应消息包括:
[0082] 拦截所述第二实现接口,以获取所述目标网络请求和所述目标响应消息;
[0083] 解析所述目标网络请求和所述目标响应消息,以获取所述目标网络请求的请求头部信息和请求体信息,以及所述目标响应消息的响应头部信息和响应体信息。
[0084] 请参阅图4,本申请还提供一种对Dio网络请求进行监控的装置,所述装置包括存储器和处理器,所述存储器用于存储计算机程序,当所述计算机程序被所述处理器执行时,可以实现如上述的对Dio网络请求进行监控的方法。具体地,在硬件层面,该装置可以包括处理器、内部总线和存储器。所述存储器可以包括内存以及非易失性存储器。处理器从非易失性存储器中读取对应的计算机程序到内存中然后运行。本领域普通技术人员可以理解,图4所示的结构仅为示意,其并不对上述装置的结构造成限定。例如,所述装置还可包括比图4中所示更多或者更少的组件,例如还可以包括其他的处理硬件,如GPU(Graphics Processing Unit,图像处理器),或者对外通信端口等。当然,除了软件实现方式之外,本申请并不排除其他实现方式,比如逻辑器件抑或软硬件结合的方式等等。
[0085] 本实施方式中,所述的处理器可以包括中央处理器(CPU)或图形处理器(GPU),当然也可以包括其他的具有逻辑处理能力的单片机、逻辑门电路、集成电路等,或其适当组合。本实施方式所述的存储器可以是用于保存信息的记忆设备。在数字系统中,能保存二进制数据的设备可以是存储器;在集成电路中,一个没有实物形式的具有存储功能的电路也可以为存储器,如RAM、FIFO等;在系统中,具有实物形式的存储设备也可以叫存储器等。实现的时候,该存储器也可以采用云存储器的方式实现,具体实现方式,本说明书不做限定。
[0086] 需要说明的是,本说明书中的对Dio网络请求进行监控的装置,具体的实现方式可以参照方法实施方式的描述,在此不作一一赘述。
[0087] 由此可见,本申请提供的技术方案,首先在Flutter框架中引入AspectD实现层,然后利用AspectD实现层对Flutter应用层进行挂钩处理,以获取dio实例,这样当Flutter应用层调用dio实例对网络请求进行封装时,AspectD实现层便可以对网络请求的发送时长、数据的加载时间等网络情况进行监控,并且当Flutter应用层接收到对应的响应信息时,AspectD实现层同样可以对网络请求的响应时长进行监控。如此,通过利用AspectD实现层对Dio网络请求底层库中的特定方法和特定位置进行无痕埋点,便可以在不对Flutter应用代码进行任何修改的情况下,获取到Dio网络请求的发送时长、响应时长等数据指标。同时,通过设置拦截器,AspectD实现层还可以对网络请求的请求头部信息和请求体信息,以及响应信息的响应头部信息和响应体信息进行监控,这样,开发者便可以根据监控情况,对Flutter应用进行针对性的优化。
[0088] 通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件来实现。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
[0089] 以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。