基于ajax的数据仿真方法、客户端及系统与流程

文档序号:16608445发布日期:2019-01-14 21:21阅读:135来源:国知局
基于ajax的数据仿真方法、客户端及系统与流程

本发明涉及数据仿真技术领域,具体涉及一种基于ajax的数据仿真方法、客户端及系统。



背景技术:

基于web的传统应用在企业中得到了广泛的应用,web页面仅仅会提供用户填写信息的表单或者到其他资源的链接,比如另外一个网页的链接。用户唯一可能做的是向web表单输入数据或者是单击一个链接,然而,这种方式会因为长时间的延迟造成终端用户体验较差。ajax(asynchronousjavascriptandxml,异步javascript和xml)是近些年提出的一项综合技术,是指一种创建交互式网页应用的网页开发技术,可以以非阻塞的方式请求服务器端资源。其主要特点是为web开发提供异步的数据传输和交换方式,可以在不重载刷新界面的情况下与服务器进行数据交换,这样就可以使网页从服务器请求少量的信息,而不是整个页面,ajax技术的用户交互的关键在于,可以仅向服务器发送并取回必需的数据而不是当前呈现的整web页面的庞大的数据(html、css、图片、脚本、flash等)。因为在服务器和客户端之间传输的数据大量减少,客户端得到的响应也就更快,用户在等待的时间内可以处理其他事情。

然而,ajax请求仅支持http协议的路径,因此需要部署专门的http应用服务器进行支持,只要添加了ajax请求相关的代码,前端程序就不能独立在本地静态的运行了,否则会产生跨域错误,只能部署在http服务器上。另外,由于ajax请求依赖了http服务器的接口开发,如果http服务器的接口还未完全开发好,前端程序的编码开发进度也会产生阻塞。

针对前述问题,如果能通过数据仿真的方法,模拟服务器接口的响应,就可以使前端开发过程和后端开发过程完全分离,并列进行开发而不互相依赖和干扰,大幅缩短项目开发周期,也使得依赖ajax接口的前端程序能够脱离http服务器独立运行,并具备可以支持单元测试的能力,本发明因此而来。



技术实现要素:

本发明提供一种基于ajax的数据仿真方法、客户端及系统,解决了开发过程中ajax请求不能在本地运行、前端开发过程和后端开发过程不能完全分离、依赖ajax接口的前端程序不能够脱离http服务器独立运行、项目开发周期过长等问题。

本发明采用如下技术方案实现:

第一方面,本发明实施例提供了一种基于ajax的数据仿真方法,包括:

发送ajax请求;

提取所述ajax请求中的url,判断所述url是否需要数据仿真;

若是,则进行数据仿真;

若否,则转发所述ajax请求。

进一步的,所述判断所述url是否需要数据仿真包括:

将提取的ajax请求中的url与url规则库进行匹配,如果匹配成功,则使用预先配置好的静态报文对ajax请求进行数据响应,否则,调用http服务器接口对ajax请求进行数据响应。

进一步的,所述匹配在数据仿真框架类中进行。

进一步的,如果数据仿真框架类开启,则替换所述ajax请求原生类xmlhttprequest;

当需要仿真时,数据仿真框架类使用预先配置好的静态报文对ajax请求进行数据响应并将所述静态报文传递给原生类xmlhttprequest对象,业务层代码通过原生类xmlhttprequest对象的onreadystatechange事件监听仿真的静态报文响应,并在回调函数的参数中通过responsetext属性获取到所述静态报文响应;

当不需要仿真时,数据仿真框架类将所述请求转发给原生类xmlhttprequest对象,原生类xmlhttprequest对象向http服务器发送所述请求并获得真实的报文响应,业务层代码通过原生类xmlhttprequest对象的onreadystatechange事件监听真实的报文响应,并在回调函数的参数中通过responsetext属性获取到所述真实的报文响应。

进一步的,所述url规则库的内容包括接口名字和静态报文,其中接口名字是字符串或正则表达式,静态报文是纯文本或json对象。

第二方面,本发明实施例还提供了一种客户端,包括:

发送模块,用于发送ajax请求;

判断模块,用于判断从所述ajax请求提取的url是否匹配url规则库;

仿真模块,用于在所述ajax请求提取的url匹配url规则库时,进行数据仿真;

转发模块,用于在所述ajax请求提取的url不匹配url规则库时,进行所述ajax请求的转发。

进一步的,所述判断模块,包括提取模块,用于将提取的请求中的url与url规则库进行匹配,如果匹配成功,则使用预先配置好的静态报文对ajax请求进行数据响应,否则,调用http服务器接口对ajax请求进行数据响应。

进一步的,所述判断模块,包括数据仿真框架类,用于所述匹配。

进一步的,如果数据仿真框架类开启,则替换所述ajax请求原生类xmlhttprequest;

当需要仿真时,数据仿真框架类使用预先配置好的静态报文对ajax请求进行数据响应并将所述静态报文传递给原生类xmlhttprequest对象,业务层代码通过原生类xmlhttprequest对象的onreadystatechange事件监听仿真的静态报文响应,并在回调函数的参数中通过responsetext属性获取到所述静态报文响应;

当不需要仿真时,数据仿真框架类将所述请求转发给原生类xmlhttprequest对象,原生类xmlhttprequest对象向http服务器发送所述请求并获得真实的报文响应,业务层代码通过原生类xmlhttprequest对象的onreadystatechange事件监听真实的报文响应,并在回调函数的参数中通过responsetext属性获取到所述真实的报文响应。

进一步的,所述url规则库的内容包括接口名字和静态报文,其中接口名字是字符串或正则表达式,静态报文是纯文本或json对象。

第三方面,本发明实施例还提供了一种基于ajax的数据仿真系统,包括:客户端和http服务器;

客户端发送ajax请求;

并提取所述ajax请求中的url,判断所述url是否需要数据仿真;

若是,则进行数据仿真;

若否,则转发所述ajax请求到http服务器。

第四方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如第一方面中所述的一种基于ajax的数据仿真方法。

第五方面,本发明实施例还提供了一种终端,包括存储器,处理器及存储在存储器上并可在处理器运行的计算机程序,所述处理器执行所述计算机程序时实现如第一方面中所述的一种基于ajax的数据仿真方法。

本发明通过数据仿真框架类接收客户端发送的ajax请求,并提取ajax请求中的url,与url规则库进行匹配,如果匹配成功,则使用预先配置好的静态报文对ajax请求进行数据响应,否则,调用http服务器接口对ajax请求进行数据响应。所述数据仿真框架类采用无侵入式设计,业务层代码调用ajax请求的代码无需任何修改,即可实现ajax请求的拦截,当移除或关闭数据仿真框架类后,仍使用原有流程调用http服务器接口进行数据响应。解决了基于ajax请求的项目不能在无web服务器的本地环境直接运行、前后端接口有依赖关系时,不能并行开发的项目管理、依赖ajax接口的前端程序不能够脱离http服务器独立运行、项目开发周期过长等问题。

传统的ajax请求,无论访问相对目录产生file://本地文件请求,还是访问远程服务器接口时,都会产生跨域错误的问题,这本身是出于安全限制,对于生产环境运行的程序来说是没有任何问题的,但是对于开发和测试阶段来说,这个安全限制是个很大的障碍,使前端程序完全的依赖于后台的http服务器接口,本发明可以将本地file://协议的http请求和远程服务器的访问请求全部拦截下来,使用仿真的数据替换,就好像使用了代理服务器一样,直接提供模拟仿真的http响应,对于应用程序完全透明,应用程序中的ajax请求访问就好像真正的收到了服务端的响应一样,会收到http响应状态码200,ajax请求的readystate也会正常的置为complete状态,应用程序能收到正常的httphead和httpbody响应。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。

图1为本发明实施例一提供的一种基于ajax的数据仿真方法的流程图;

图2为本发明实施例二提供的一种基于ajax的数据仿真方法的实现原理流程图;

图3为本发明实施例三提供的一种调用ajax请求的应用业务流程图;

图4为本发明实施例四提供的一种客户端的结构框图;

图5为本发明实施例五提供的一种基于ajax的数据仿真系统的结构框图;

图6为本发明实施例七提供的一种终端设备。

具体实施方式

下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。

实施例一

图1为本发明实施例一提供的一种基于ajax的数据仿真方法的流程图,该方法可以由基于ajax的数据仿真系统来执行。如图1所示,该方法具体包括如下步骤:

步骤110、发送ajax请求;

步骤120、提取所述ajax请求中的url,判断所述url是否需要数据仿真;若是,则进行数据仿真;若否,则转发所述ajax请求。

具体的,将提取的所述ajax请求中的url与url规则库进行匹配,如果匹配成功,则使用预先配置好的静态报文对ajax请求进行数据响应,否则,调用http服务器接口对ajax请求进行数据响应。

示例性的,浏览器加载网页页面时,读取网页页面中的ajax业务代码,ajax业务代码示例如下:

浏览器解析该段ajax代码时,调用open函数向服务器发送该ajax请求,请求地址为http://www.mysite.com/contact/getcontactlist.jsp的jsp页面数据。此时,通过数据仿真框架类提取该请求中的url,即http://www.mysite.com/contact/getcontactlist.jsp,判断该url是否与url规则库相匹配,如果匹配,则进行数据仿真,如果不匹配,则不进行数据仿真。具体的,所述url规则库的内容至少包括接口名字和静态报文,其中接口名字是字符串或正则表达式,静态报文是纯文本或json对象。

示例性的,url规则库是指组件的配置文件,如是一个key-value键值对的json配置文件,可实现精确匹配和模糊匹配,当接口名字为字符串时,可实现精确匹配,例如要请求一个接口名字为/user/getuserinfo.jsp?id=1的接口,静态报文响应的正文为html类型,则配置定义如下:

当接口名字为正则表达式时,可实现模糊匹配,如:

进一步的,所述匹配在数据仿真框架类中进行,所述数据仿真框架类采用无侵入式设计,业务层代码调用ajax请求的代码无需任何修改,即可实现ajax请求的拦截,当移除或关闭数据仿真框架类后,仍使用原有流程调用http服务器接口进行数据响应。

进一步的,如果数据仿真框架类开启,则替换所述ajax请求原生类xmlhttprequest;

当需要仿真时,数据仿真框架类使用预先配置好的静态报文对ajax请求进行数据响应并将所述静态报文传递给原生类xmlhttprequest对象,业务层代码通过原生类xmlhttprequest对象的onreadystatechange事件监听仿真的静态报文响应,并在回调函数的参数中通过responsetext属性获取到所述静态报文响应;

当不需要仿真时,即真正需要http请求发送时,数据仿真框架类将所述请求转发给原生类xmlhttprequest对象,原生类xmlhttprequest对象向http服务器发送所述请求并获得真实的报文响应,业务层代码通过原生类xmlhttprequest对象的onreadystatechange事件监听真实的报文响应,并在回调函数的参数中通过responsetext属性获取到所述真实的报文响应。

本发明中,数据仿真框架类是具有http请求发送、响应的功能组件类,属于一个class类型,可以替代浏览器原生的xmlhttprequest类,其作用是在其创建时,自动替换原生的xmlhttprequest类,为应用程序提供http请求的发送和接收能力,当应用程序调用xmlhttprequest类发送请求时,调用请求实际上先经过数据仿真框架类处理,数据仿真框架类检则该请求是否需要被仿真,如果需要仿真,则使用静态报文进行响应,不再发送真正的http请求,如不需要仿真,则在内部重新创建原生的xmlhttprequest类发送http请求。

实施例二

图2为本发明实施例二提供的一种基于ajax的数据仿真方法的实现原理流程图,该方法可以由基于ajax的数据仿真系统来执行。如图2所示,具体包括如下步骤:

步骤210、初始化数据仿真框架类;

本实施例,在页面加载成功之前,先实例化数据仿真框架类,以使数据仿真框架类在任意的ajax请求发出之前完成初始化;避免ajax请求将不能使用数据仿真。

步骤220、替换原生类xmlhttprequest对象为仿真框架中的仿真xmlhttprequest对象,并将原生的xmlhttprequest对象进行备份;

具体的,用数据仿真框架类替换掉ajax请求处理原生类xmlhttprequest,业务层代码仍使用xmlhttprequest的全局变量名创建xmlhttprequest类的实例,但实际创建的是数据仿真框架类的实例,即仿真xmlhttprequest对象,数据仿真框架类的仿真xmlhttprequest对象实现与原生的xmlhttprequest类的xmlhttprequest对象完全一致的api接口,对于客户端的业务代码完全透明,在客户端本地实现了对原生xmlhttprequest对象的透明代理。

将原生的xmlhttprequest对象进行备份保存,当需要真正发送http请求时,则调用备份保存的原生xmlhttprequest对象发送。

步骤230、拷贝xmlhttprequest原型属性与原型方法,使用apply模式代理调用;

具体的,通过拷贝xmlhttprequest原型的方式处理原生xmlhttprequest类的属性和方法,当真正需要http请求发送时,浏览器调用的url和参数将会原封不动的转发给原生xmlhttprequest类相应的方法,如open、send、setrequestheader等。拷贝后再通过原型继承进行扩展,示例代码如下:

步骤240、实现url规则库的接口添加,注册url拦截规则与静态报文的映射关系;

具体的,url规则库的接口添加是通过数据仿真框架类的公开方法提供,其中,公开方法是指面向对象中的publicmethod,在面向对象编程中,函数分为私有函数和公开函数,私有函数只能在类文件内部调用,不能被外部其它文件调用,而公开函数则可以被外部调用,公开函数被称为公开方法,即publicmethod。url规则库的内容主要包含接口名字和静态报文。接口名字是字符串或正则表达式,静态报文是纯文本或json对象。

步骤250、改写send方法,匹配url规则进行拦截调用;

具体的,主要实现了对xmlhttprequest.send等方法的拦截,调用send方法时,将对url规则库里面的url匹配,如果符合规则,则取url规则库配置的接口地址映射的本地json报文进行响应。

步骤260、使用set存取器,将数据仿真框架类的onreadystatechange回调注册给原生的xmlhttprequest对象;

步骤270、在onreadystatechange中注入逻辑,使用本地静态报文替换响应体responsetext;

具体的,通过defineproperty方法实现对onreadystatechange事件进行逻辑注入,启用数据仿真框架类后,业务层代码仍然使用xmlhttprequest对象的onreadystatechange属性添加响应回调函数,在数据仿真框架类中,使用闭包函数进行了一次包装,目的是为了在响应回调函数执行前,设置原生xmlhttprequest对象的状态和属性,保证了ajax请求路径未匹配到仿真数据规则时,onreadystatechange事件能够正确触发,并得到正常的responsetext响应报文和状态码。示例代码如下:

步骤280、当请求send方法调用并匹配到规则时,触发响应回调函数,设置响应头为json格式。

具体的,当send方法调用时,如果是需要仿真的接口,则从本地的url规则库中加载静态的json报文,直接赋值给xml对象的responsetext属性,并直接触发onreadystatechange进行回调。示例代码如下:

实施例三

图3为本发明实施例三提供的一种调用ajax请求的应用业务流程图,该方法可以由基于ajax的数据仿真系统来执行。如图3所示,该方法具体包括如下步骤:

步骤310、开始发送ajax请求,进入步骤320;

具体地,当引入本发明的数据仿真框架类后,应用业务调用xmlhttprequest对象时,请求自动被数据仿真框架类拦截。

步骤320、检测ajax请求中的url是否需要数据仿真,若检测结果为是,则进入步骤330,若检测结果为否,则进入步骤340;

具体地,对ajax请求中的get或post请求地址进行检测,检测请求地址中的url是否与url规则库进行匹配,从而确定是否需要数据仿真。

进一步的,当请求地址中的url与url规则库匹配,则确定需要数据仿真,进入步骤330,当请求地址中的url与url规则库不匹配,则确定不需要数据仿真,进入步骤340。

步骤330、获取url对应的响应报文配置,进入步骤350;

具体的,从本地加载与url对应的json静态报文进行响应。

步骤340、调用原生xmlhttprequest发送http请求,进入步骤390;

步骤350、判断响应报文配置的数据类型是否为object,如果是,则进入步骤360,否则进入步骤370;

步骤360、设置content-type为application/json,不改变响应流的数据类型,因为业务层可能根据报文类型自动使用json.parse进行解析,然后进入步骤380;

步骤370、设置content-type为text/html,进入步骤380;

步骤380、手工触发onreadystatechange回调方法,并设置响应报文参数,进入步骤390;

步骤390、请求响应方法执行。

具体的,应用业务中注册的请求成功回调函数被执行。

以下以应用场景为聊天工具中需要获取好友列表进行显示为例进行说明,过程如下:

本示例中,业务代码是一外聊天工具,需要调用获取好友列表显示好友,获取好友列表的接口在/contact/getcontactlist.jsp;

浏览器加载网页页面时,读取网页页面中的ajax业务代码,ajax业务代码示例如下:

本示例中,业务代码调用jquery的ajax创建xmlhttprequest对象,此外,也可以用原生javascript脚本中的newxmlhttprequest()方法创建xmlhttprequest对象。创建xmlhttprequest对象时,由于已经采用数据仿真框架类对原生xmlhttprequest类进行了替换,因此实际创建的是数据仿真框架类的对象,即仿真xmlhttprequest对象。浏览器解析该段ajax业务代码时,调用open函数向服务器发送ajax请求,请求地址为http://www.mysite.com/contact/getcontactlist.jsp的jsp页面数据。此时,通过数据仿真框架类提取该请求中的url,即http://www.mysite.com/contact/getcontactlist.jsp,判断该url是否与url规则库相匹配,即,循环url规则库,查看是否存在与getcontactlist.jsp接口名字相关的配置,配置规则可如下:

如果存在,如本示例的配置中,找到“/contact/getcontactlist.jsp"的配置项,取出相应的responsetext配置节点的内容[{contactid:1,name:"张三"},{contactid:2,name:"李四"}],直接触发onreadystatechange响应函数回调业务代码,设置状态码属性为“成功”,设置响应报文为[{contactid:1,name:"张三"},{contactid:2,name:"李四"}],业务代码将会认为http请求已经成功返回了,并且收到响应报文[{contactid:1,name:"张三"},{contactid:2,name:"李四"}]。可见,本示例虽然实际上并没真正的发送http请求,也不存在任何的网络交互,但业务代码并不知晓,就好像真正的发送了http请求并真实的接收到了http响应的报文;

如果不存在,则调用原生xmlhttprequest对象的send函数发送http请求到http应用服务器,这时就相当于没用使用数据仿真框架类的情况,http请求被正常发送。

实施例四

图4为本发明实施例四提供的一种客户端的结构框图,其中,该客户端400可由软件和/或硬件实现。如图4所示,该客户端400包括发送模块401、判断模块402、仿真模块403、转发模块404。

其中,发送模块401,用于发送ajax请求;

判断模块402,用于判断从所述ajax请求提取的url是否匹配url规则库;

仿真模块403,用于在所述ajax请求提取的url匹配url规则库时,进行数据仿真;

转发模块404,用于在所述ajax请求提取的url不匹配url规则库时,进行所述ajax请求的转发。

进一步的,所述判断模块402,包括提取模块,用于将提取的请求中的url与url规则库进行匹配,如果匹配成功,则使用预先配置好的静态报文对ajax请求进行数据响应,否则,调用http服务器接口对ajax请求进行数据响应。

进一步的,所述判断模块402,包括数据仿真框架类,用于所述匹配,所述数据仿真框架类采用无侵入式设计,业务层代码调用ajax请求的代码无需任何修改,即可实现ajax请求的拦截,当移除或关闭数据仿真框架类后,仍使用原有流程调用http服务器接口进行数据响应。

进一步的,如果数据仿真框架类开启,则替换所述ajax请求原生类xmlhttprequest;

当需要仿真时,数据仿真框架类使用预先配置好的静态报文对ajax请求进行数据响应并将所述静态报文传递给原生类xmlhttprequest对象,业务层代码通过原生类xmlhttprequest对象的onreadystatechange事件监听仿真的静态报文响应,并在回调函数的参数中通过responsetext属性获取到所述静态报文响应;

当不需要仿真时,即当真正需要http请求发送时,数据仿真框架类将所述请求转发给原生类xmlhttprequest对象,原生类xmlhttprequest对象向http服务器发送所述请求并获得真实的报文响应,业务层代码通过原生类xmlhttprequest对象的onreadystatechange事件监听真实的报文响应,并在回调函数的参数中通过responsetext属性获取到所述真实的报文响应。

进一步的,所述url规则库的内容包括接口名字和静态报文,其中接口名字是字符串或正则表达式,静态报文是纯文本或json对象。

实施例五

图5为本发明实施例五提供的一种基于ajax的数据仿真系统500的结构框图,其中,该系统500可由软件和/或硬件实现。如图5所示,该系统500包括客户端501和http服务器502。

其中,客户端501发送ajax请求;

客户端501提取所述ajax请求中的url,判断所述url是否需要数据仿真;

若是,则进行数据仿真;

若否,则转发所述ajax请求到http服务器502。

实施例六

本发明实施例六还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时,实现一种基于ajax的数据仿真方法,该方法包括:

发送ajax请求;

提取所述ajax请求中的url,判断所述url是否需要数据仿真;

若是,则进行数据仿真;

若否,则转发所述ajax请求。

实施例七

图6为本发明实施例七提供的一种终端设备600,包括存储器602,处理器601及存储在存储器602上并可在处理器601运行的计算机程序,所述处理器601执行所述计算机程序时实现一种基于ajax的数据仿真方法,该方法包括:

发送ajax请求;

提取所述ajax请求中的url,判断所述url是否需要数据仿真;

若是,则进行数据仿真;

若否,则转发所述ajax请求。

通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本发明可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、闪存(flash)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。

值得注意的是,本发明的实施例中,所包括的各个单元和模块只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能模块的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。

注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1