CN114911472A - GraphQL接口的调用方法、装置、电子设备及存储介质 - Google Patents
GraphQL接口的调用方法、装置、电子设备及存储介质 Download PDFInfo
- Publication number
- CN114911472A CN114911472A CN202210578540.2A CN202210578540A CN114911472A CN 114911472 A CN114911472 A CN 114911472A CN 202210578540 A CN202210578540 A CN 202210578540A CN 114911472 A CN114911472 A CN 114911472A
- Authority
- CN
- China
- Prior art keywords
- graphql
- file
- interface
- target
- determining
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/36—Software reuse
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Image Generation (AREA)
- Stored Programmes (AREA)
Abstract
本发明实施例涉及一种GraphQL接口的调用方法、装置、电子设备及存储介质,所述方法包括:获取目标GraphQL文件;根据所述目标GraphQL文件确定GraphQL接口参数集;将所述GraphQL接口参数集中的GraphQL接口参数进行拼接,生成JS代码,以通过执行所述JS代码生成用于调用所述GraphQL接口的HTTP请求。由此,能够实现简化开发人员的开发过程,避免在前端调用接口时,手动拼接接口格式和接口参数的繁琐操作。
Description
技术领域
本发明实施例涉及计算机技术领域,尤其涉及一种GraphQL接口的调用方法、装置、电子设备及存储介质。
背景技术
GraphQL是一种用于API(ApplicationProgrammingInterface,应用程序编程接口)的数据查询语言,通过对API中的数据提供一套易于理解的完整描述,使得客户端能够准确地获得目标数据,减少数据的冗余。
随着技术和业务的不断发展,GraphQL在开发中的应用更加广泛,但是在前端调用接口的方式并不友好,需要手动拼接接口格式和接口参数,或者使用vue-apollo这样的插件,但是对项目中组件的侵入性较大,比如对传统的基于vue2的web项目,每个调用GraphQL接口的组件都需要修改,组件中定义的data属性,还需要增加相应的apollo属性,尤其对于将接口请求调用单独统一封装的项目,其不符合项目的架构,给维护造成不便。
发明内容
鉴于此,为实现简化开发人员的开发过程,避免在前端调用接口时,手动拼接接口格式和接口参数的繁琐操作,本发明实施例提供一种GraphQL接口的调用方法、装置、电子设备及存储介质。
第一方面,本发明实施例提供一种GraphQL接口的调用方法,所述方法包括:
获取目标GraphQL文件;
根据所述目标GraphQL文件确定GraphQL接口参数集;
将所述GraphQL接口参数集中的GraphQL接口参数进行拼接,生成JS代码,以通过执行所述JS代码生成用于调用所述GraphQL接口的HTTP请求。
在一个可能的实施方式中,所述根据所述目标GraphQL文件确定GraphQL接口参数集,包括:
读取所述目标GraphQL文件的指定位置处的数据,根据读取到的数据确定GraphQL端点URL地址;
根据所述目标GraphQL文件确定操作参数;
将所述GraphQL端点URL地址和所述操作参数分别确定为一项GraphQL接口参数,并归入GraphQL接口参数集。
在一个可能的实施方式中,所述根据读取到的数据确定GraphQL端点URL地址,包括:
若读取到的数据为URL地址,则将读取到的数据确定为GraphQL端点URL地址;
或者,若读取到的数据为URL地址标识,则从指定文件中确定与所述URL地址标识对应的URL地址;将所述对应的URL地址确定为GraphQL端点URL地址。
在一个可能的实施方式中,所述根据所述目标GraphQL文件确定操作参数,包括:
确定所述目标GraphQL文件是否具有依赖文件;
若是,则获取所述目标GraphQL文件的依赖文件;从所述目标GraphQL文件和所述依赖文件中提取操作参数;
若否,则从所述目标GraphQL文件中提取操作参数。
在一个可能的实施方式中,所述从所述目标GraphQL文件和所述依赖文件中提取操作参数,包括:
生成所述目标GraphQL文件的第一抽象语法树,以及生成所述依赖文件的第二抽象语法树;
从所述第一抽象语法树中确定query节点和/或mutation节点;从所述第二抽象语法树中确定fragement节点;
将所述query节点中的数据与所述fragement节点中的数据进行拼接,和/或,将所述mutation节点中的数据与所述fragement节点中的数据进行拼接;
将拼接后的数据作为操作参数。
在一个可能的实施方式中,所述方法还包括:
从所述第一抽象语法树中确定query节点和/或mutation节点的节点名称;
将所述节点名称确定为一项GraphQL接口参数,并归入所述GraphQL接口参数集。
在一个可能的实施方式中,所述方法还包括:
从指定文件中获取方法参数;
在执行所述JS代码生成用于调用所述GraphQL接口的HTTP请求之后,根据所述方法参数中的方法,发送所述HTTP请求。
第二方面,本发明实施例提供一种GraphQL接口的调用装置,所述装置包括:
获取模块,用于获取目标GraphQL文件;
确定模块,用于根据所述目标GraphQL文件确定GraphQL接口参数集;
拼接模块,用于将所述GraphQL接口参数集中的GraphQL接口参数进行拼接,生成JS代码,以通过执行所述JS代码生成用于调用所述GraphQL接口的HTTP请求。
在一个可能的实施方式中,所述确定模块,包括:
读取子模块,用于读取所述目标GraphQL文件的指定位置处的数据,根据读取到的数据确定GraphQL端点URL地址;
第一确定子模块,用于根据所述目标GraphQL文件确定操作参数;
第二确定子模块,用于将所述GraphQL端点URL地址和所述操作参数分别确定为一项GraphQL接口参数,并归入GraphQL接口参数集。
在一个可能的实施方式中,所述读取子模块,具体用于:
若读取到的数据为URL地址,则将读取到的数据确定为GraphQL端点URL地址;
或者,若读取到的数据为URL地址标识,则从指定文件中确定与所述URL地址标识对应的URL地址;将所述对应的URL地址确定为GraphQL端点URL地址。
在一个可能的实施方式中,所述第一确定子模块,包括:
确定单元,用于确定所述目标GraphQL文件是否具有依赖文件;
获取单元,用于若确定所述目标GraphQL文件具有依赖文件,则获取所述目标GraphQL文件的依赖文件;
第一提取单元,用于从所述目标GraphQL文件和所述依赖文件中提取操作参数;
第二提取单元,用于若确定所述目标GraphQL文件不具有依赖文件,则从所述目标GraphQL文件中提取操作参数。
在一个可能的实施方式中,所述第一提取单元,具体用于:
生成所述目标GraphQL文件的第一抽象语法树,以及生成所述依赖文件的第二抽象语法树;
从所述第一抽象语法树中确定query节点和/或mutation节点;从所述第二抽象语法树中确定fragement节点;
将所述query节点中的数据与所述fragement节点中的数据进行拼接,和/或,将所述mutation节点中的数据与所述fragement节点中的数据进行拼接;
将拼接后的数据作为操作参数。
在一个可能的实施方式中,所述装置还包括:
节点名称确定模块,用于从所述第一抽象语法树中确定query节点和/或mutation节点的节点名称;
接口参数确定模块,用于将所述节点名称确定为一项GraphQL接口参数,并归入所述GraphQL接口参数集。
在一个可能的实施方式中,所述装置还包括:
方法参数获取模块,用于从指定文件中获取方法参数;
发送模块,用于在执行所述JS代码生成用于调用所述GraphQL接口的HTTP请求之后,根据所述方法参数中的方法,发送所述HTTP请求。
第三方面,本发明实施例提供一种电子设备,包括:处理器和存储器,所述处理器用于执行所述存储器中存储的一种GraphQL接口的调用程序,以实现第一方面中任一项所述的GraphQL接口的调用方法。
第四方面,本发明实施例提供一种存储介质,所述存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现第一方面中任一项所述的GraphQL接口的调用方法。
本发明实施例提供的技术方案,通过获取目标GraphQL文件,并根据目标GraphQL文件确定GraphQL接口参数集,将GraphQL接口参数集中的GraphQL接口参数进行拼接,生成JS代码,以执行该JS代码生成用于调用GraphQL接口的HTTP请求。在这一技术方案中,可直接通过将获取的GraphQL接口参数拼接生成JS代码,该JS代码可直接生成调用GraphQL接口的HTTP请求,无需用户手动拼接成调用GraphQL接口的HTTP请求。实现了简化开发人员的开发过程,避免在前端调用接口时,手动拼接接口格式和接口参数的繁琐操作。
附图说明
图1为本发明实施例提供的一种GraphQL接口的调用方法的实施例流程图;
图2为本发明实施例提供的另一种GraphQL接口的调用方法的实施例流程图;
图3为本发明实施例提供的一种从目标GraphQL文件和依赖文件中提取操作参数的实施例流程图;
图4为本发明实施例提供的又一种GraphQL接口的调用方法的实施例流程图;
图5为本发明实施例提供的再一种GraphQL接口的调用方法的实施例流程图;
图6为本发明实施例提供的一种GraphQL接口的调用装置的实施例框图;
图7为本发明实施例提供的一种电子设备的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
下面结合附图以具体实施例对本发明提供的GraphQL接口的调用方法做进一步的解释说明,实施例并不构成对本发明实施例的限定。
参见图1,为本发明实施例提供的一种GraphQL接口的调用方法的实施例流程图。如图1所示,该流程可包括以下步骤:
步骤101、获取目标GraphQL文件。
上述GraphQL文件可以包括后缀名为.gql或者.graphql的文件。
在一实施例中,本发明实施例的执行主体可从指定存储介质中获取上述目标GraphQL文件。例如,开发人员可将上述.gql文件或者.graphql文件上传至XX平台上,在进行项目开发时,可直接从XX平台上获取目标GraphQL文件。
在另一实施例中,本发明实施例的执行主体可在项目文件包中查找后缀名为.gql或者.graphql的文件,将查找到的文件确定为目标GraphQL文件。
步骤102、根据目标GraphQL文件确定GraphQL接口参数集。
上述GraphQL接口参数集是指在调用GraphQL接口时所用到的接口参数集合。
可选的,上述GraphQL接口参数集合可包括GraphQL端点URL地址和操作参数。其中,操作参数可包括query(查询)参数和/或mutation(变更)参数。
在一实施例中,本发明实施例的执行主体可读取目标GraphQL文件的指定位置处的数据,并根据读取到的数据确定GraphQL端点URL地址。上述指定位置可为目标GraphQL文件的指定行数,例如目标GraphQL文件的第一行,或者目标GraphQL的最后一行,本发明对此不做限制。
作为一个可能的实施方式,本发明实施例的执行主体从目标GraphQL文件的指定位置读取到的数据可为URL地址。此时,可将读取到的数据确定为GraphQL端点URL地址。
作为另一个可能的实施方式,本发明实施例的执行主体从目标GraphQL文件的指定位置读取到的数据可为URL地址标识。此时,可从指定文件中确定与上述URL地址标识对应的URL地址,并将该URL地址确定为GraphQL端点URL地址。其中,上述指定文件可预先存储有URL地址标识与URL地址的对应关系。
至于本发明实施例的执行主体是如何根据目标GraphQL文件确定操作参数的,在下文中通过图2所示流程进行说明,这里先不详述。
步骤103、将GraphQL接口参数集中的GraphQL接口参数进行拼接,生成JS代码,以通过执行JS代码生成用于调用GraphQL接口的HTTP请求。
在一实施例中,将上述GraphQL接口参数集中的GraphQL接口参数进行拼接,可生成JS代码,该JS代码可根据拼接的参数生成用于调用GraphQL接口的HTTP请求。
举个例子,本发明实施例的执行主体在将GraphQL接口参数集中的GraphQL接口参数进行拼接之后,可生成如下的JS代码:
function(variables,reqOptions){
var data={
operationName:name,
query:oper,
variables:variables
};
return(request.default||request)(url,data,reqOptions)
};
其中,oper为操作参数,url为GraphQL端点URL地址,执行上述JS代码可生成用于调用GraphQL接口的HTTP请求。
本发明实施例提供的技术方案,通过获取目标GraphQL文件,并根据目标GraphQL文件确定GraphQL接口参数集,将GraphQL接口参数集中的接口参数进行拼接,生成JS代码,以执行该JS代码生成用于调用GraphQL接口的HTTP请求。在这一技术方案中,可直接通过将获取的GraphQL接口参数拼接生成JS代码,该JS代码可直接生成调用GraphQL接口的HTTP请求,无需用户手动拼接成调用GraphQL接口的HTTP请求。实现了简化开发人员的开发过程,避免在前端调用接口时,手动拼接接口格式和接口参数的繁琐操作。
参见图2,为本发明实施例提供的另一种GraphQL接口的调用方法的实施例流程图。该图2所示流程在上述图1所示流程的基础上,着重描述本发明实施例的执行主体是如何根据目标GraphQL文件确定操作参数的。如图2所示,该流程可包括以下步骤:
步骤201、确定目标GraphQL文件是否具有依赖文件,若是,则执行步骤202;若否,则执行步骤204。
步骤202、获取目标GraphQL文件的依赖文件。
步骤203、从目标GraphQL文件和依赖文件中提取操作参数。
以下对步骤201~步骤203进行统一说明:
上述目标GraphQL文件可以引入其他依赖文件,该依赖文件可为GraphQL文件。例如,在目标GraphQL文件中可通过#import、#include、#require等方式引入其他依赖的.graphql或.gql文件。
在一实施例中,通过解析目标GraphQL文件,可确定目标GraphQL文件中是否具体依赖文件。若是,则获取目标GraphQL文件的依赖文件,并从目标GraphQL文件和依赖文件中提取操作参数;若否,则执行步骤204。需要说明的是,在上述获取目标GraphQL文件中的依赖文件时,可首先判断上述依赖文件是否存在重复文件,若存在,则对上述依赖文件进行去重处理,并获取去重处理后的依赖文件。
具体的,在从目标GraphQL文件和依赖文件中提取操作参数时,可通过如图3所示的流程来实现。如图3所示,为本发明实施例提供的一种从目标GraphQL文件和依赖文件中提取操作参数的实施例流程图,该流程可包括以下步骤:
步骤301、生成目标GraphQL文件的第一抽象语法树,以及生成依赖文件的第二抽象语法树。
上述抽象语法树是源代码语法结构的一种抽象表示,树上的每个节点都表示源代码中的一种结构。目前在应用中,可以生成源代码的抽象语法树,然后对抽象语法树中的节点进行操作,比如插入、修改、删除等操作,之后则可以基于抽象语法树生成所需要的目标代码。
由此可见,抽象语法树可以获取每一节点的数据,并对该数据进行操作。本发明实施例中,利用抽象语法树来获取目标GraphQL文件和依赖文件中的操作参数。
这里为描述方便,将生成的目标GraphQL文件的抽象语法树称为第一抽象语法树,将生成的依赖文件的抽象语法树称为第二抽象语法树。
步骤302、从第一抽象语法树中确定query节点和/或mutation节点。
步骤303、从第二抽象语法树中确定fragment节点。
以下对步骤302和步骤303进行统一说明:
上述query节点对应query操作参数,该query操作参数用于查询数据。
上述mutation节点对应mutation操作参数,该mutation操作参数用于更改数据。
上述fragment节点对应fragment片段,该片段用于将query和/或mutation重复的内容进行封装,以减少query和/或mutation中的重复内容。
由上述描述可知,语法抽象树上的每一节点都表示源代码中的一种结构,而query操作参数和mutation操作参数为目标GraphQL文件中的一种结构,因此,在目标GraphQL文件对应的第一抽象语法树上存在query节点和/或mutation节点。
同样的,上述依赖文件对应的第二抽象语法树上存在fragment节点。
步骤304、将query节点中的数据与fragment节点中的数据进行拼接,和/或,将mutation节点中的数据与fragment节点中的数据进行拼接。
步骤305、将拼接后的数据作为操作参数。
以下对步骤304和步骤305进行统一说明:
由上述描述可知,fragment片段用于将query和/或mutation重复的内容进行封装,因此,query节点或者mutation节点中的数据可与fragment节点中的数据进行拼接。例如,以下为fragment节点与query节点的一种拼接示例:
作为一个可能的实施方式,query和/或mutation节点的数据与fragment节点的数据可拼接成新的抽象语法树,并将该抽象语法树转换为字符串,可将转换为字符串的数据作为操作参数。
作为另一个可能的实施方式,query节点和/或mutation节点可先转换为字符串格式的数据,同时,将fragment节点数据转换为字符串格式的数据。之后,将query节点和/或mutation节点对应的字符串数据与fragment节点对应的字符串数据进行拼接,得到操作参数。
至此,完成对图3的描述。
步骤204、从目标GraphQL文件中提取操作参数。
在一实施例中,当确定目标GraphQL文件不存在依赖文件时,可直接从目标GraphQL文件中提取操作参数。
作为一个可能的实施方式,本发明实施例的执行主体可直接通过解析目标GraphQL文件,从中获取query操作参数和/或mutation操作参数。
作为另一个可能的实施方式,本发明实施例的执行主体可先生成目标GraphQL文件对应的抽象语法树,再从目标GraphQL文件对应的抽象语法树中获取query节点和/或mutation节点的数据,从而获取query操作参数和/或mutation操作参数。
本发明实施例提供的技术方案,通过确定目标GraphQL文件是否具有依赖文件,在目标GraphQL文件具有依赖文件的情况下,获取该目标GraphQL的依赖文件,并从目标GraphQL文件和依赖文件中提取操作参数;在目标GraphQL文件不具有依赖文件的情况下,可直接从目标GraphQL文件中提取操作参数,实现了根据目标GraphQL文件更加准确地确定操作参数。
参见图4,为本发明实施例提供的又一种GraphQL接口的调用方法的实施例流程图。如图4所示,该流程可包括以下步骤:
步骤401、获取目标GraphQL文件。
步骤402、读取目标GraphQL文件的指定位置处的数据,根据读取到的数据确定GraphQL端点URL地址。
步骤403、根据目标GraphQL文件确定操作参数。
步骤401~步骤403的详细描述可参见上述步骤101~步骤102中的描述,这里不再赘述。
步骤404、生成目标GraphQL文件的第一抽象语法树,并从第一抽象语法树中确定query节点和/或mutation节点的节点名称。
步骤405、将GraphQL端点URL地址、操作参数,以及节点名称分别确定为一项GraphQL接口参数,并归入GraphQL接口参数集。
步骤406、将GraphQL接口参数集中的GraphQL接口参数进行拼接,生成JS代码,以通过执行JS代码生成用于调用GraphQL接口的HTTP请求。
以下对步骤404~步骤406进行统一说明:
由图3的描述可知,抽象语法树是源代码语法结构的一种抽象表示,树上的每个节点都表示源代码的一种结构,而query节点和/或mutation节点作为目标GraphQL文件的结构,在目标GraphQL文件对应的第一抽象语法树中会存在相应的去query节点和/或mutation节点,该节点中可记录query和/或mutation的节点名称。
基于此,为了在调用GraphQL接口时可以更加快速、准确地获取操作参数,本发明实施例的执行主体可从目标GraphQL文件的第一抽象语法树中获取query和/或mutation节点的节点名称,并将节点名称确定为GraphQL接口参数。
在一实施例中,可将上述GraphQL端点URL地址、操作参数,以及节点名称分别确定为一项GraphQL接口参数,并归入GraphQL接口参数集,并将该GraphQL接口参数集中的GraphQL接口参数进行拼接,生成JS代码,该JS代码在被执行时可生成用于调用GraphQL接口的HTTP请求。
举个例子,本发明实施例的执行主体在将GraphQL接口参数进行拼接之后,可生成如下的JS代码:
function(variables,reqOptions){
var data={
operationName:name,
query:oper,
variables:variables
};
return(request.default||request)(url,data,reqOptions)}
其中,name为query和/或mutation节点的节点名称,oper为操作参数,url为GraphQL端点URL地址,执行上述JS代码可生成用于调用GraphQL接口的HTTP请求。
步骤407、从指定文件中获取方法参数。
步骤408、根据方法参数中的方法,发送上述HTTP请求。
以下对步骤407和步骤408进行统一说明:
由步骤408可知,存在一个方法参数,该方法参数可以将上述生成的HTTP请求发送出去。
在一实施例中,本发明实施例的执行主体可从指定文件中获取上述方法参数,并将该方法参数写入上述JS代码中,在JS代码生成用于调用GraphQL接口的HTTP请求后,可利用该方法参数中的方法将上述HTTP请求发送出去。
在另一实施例中,本发明实施例的执行主体可给上述方法参数设置一个默认方法,例如require.resolve('./request'),并将该方法参数写入上述JS代码中,在JS代码生成用于调用GraphQL接口的HTTP请求后,可利用该方法参数中的默认方法将上述HTTP请求发送出去。
本发明实施例提供的技术方案,通过进一步将query节点和/或mutation节点的节点名称确定为一项GraphQL接口参数,并归入GraphQL接口参数集,在生成调用GraphQL接口的HTTP请求之后,利用方法参数对应的方法将上述HTTP请求发送出去。在这一技术方案中,为了在调用GraphQL接口时可以更加快速、准确地获取操作参数,可进一步将query节点和/或mutation节点的节点名称确定为GraphQL接口参数,并在生成HTTP请求后,及时利用方法参数将上述HTTP请求发送出去。实现了简化开发人员的开发过程,避免在前端调用接口时,手动拼接接口格式和接口参数的繁琐操作。
参见图5,为本发明实施例提供的再一种GraphQL接口的调用方法的实施例流程图。该图5所示流程以实际应用中loader的配置为例,对本发明实施例提供的GraphQL接口的调用方法进行说明。如图5所示,该流程可包括以下内容:
在一示例性应用场景中,当开发前端项目,需要引用GraphQL文件中的函数时,可通过import graphql引入GraphQL文件,并利用本发明实施例提供的GraphQL接口的调用方法,直接调用GraphQL接口,从而调用GraphQL文件中的函数。
具体的,本发明实施例利用webpack中的loader来实现GraphQL接口的调用方法,其中,loader是一个导出为function的node模块。可以将匹配到的文件进行一次转换,同时loader可以链式传递。loader文件处理器是一个CommonJs风格的函数,该函数接收一个String/Buffer类型的入参,并返回一个String/Buffer类型的返回值。
进一步,在配置webpack中的loader时,可首先获取目标GraphQL文件,也即.graphql文件,之后,配置loader,在本发明实施例中可将该loader称为mp-gq-loader。
首先,获取配置的options(选择项),优先采用项目配置传入到loader中的options,如果没有,则使用默认值。上述options包含以下参数项:
{url:‘’,
urlXXX:‘’,
requestAbsPath:‘’,
extensions:EXTENSIONS}
其中,url为GraphQL端点URL地址;urlXXX为当项目中存在多个Gra phQL端点时,可用url为前缀指定其中任一个端点;上述requestAbsPath:”为包含自定义的HTTP调用方法的JS文件路径,默认为require.resolve('./requ est');extensions:EXTENSIONS为文件扩展名,默认为.gql或.graphql。
然后,获取上述配置的options:可选的,读取目标GraphQL文件第1行,结合options,确定当前的GraphQL端点URl地址。之后,解析上述目标GraphQL文件,并判断该目标GraphQL文件存在依赖的情况下,获取其依赖内容,并将目标GraphQL文件和依赖文件生成相应的AST(Abstract Syntax Code,抽象语法树)。
之后,获取上述对应的AST,以graphql文件中query、mutation或fragment名称做为key,将对应AST保存到一个对象的query、mutation、fragment属性中。如果query、mutation中用到fragment,则提取fragment合并拼接到query或者mutation的AST中,之后再将AST转为字符串,得到最终的query、mutation。
再然后,根据上述得到的GraphQL端点URL地址和query或者mutation操作参数,生成用于导出GraphQL的HTTP请求函数的JS代码,例如:
function(variables,reqOptions){
var data={
operationName:name,
query:oper,
variables:variables
};
return(request.default||request)(url,data,reqOptions)}
var requestFun=${requireFileAsExpression(options.requestAbsPath)};
var url='${url}';
var operations=${JSON.stringify(operations)}
其中,name为query和/或mutation节点的节点名称,oper为操作参数,url为GraphQL端点URL地址,执行上述JS代码可生成用于调用GraphQL接口的HTTP请求。需要说明的是,由于windows下,利用require.resolve获取到的文件路径中是包含单反斜杠‘\’的字符串,例如‘D:\workspace\project\src\kit\myrequest.js’,‘\’为转义字符串,直接引用这个字符串会导致转义字符被忽略,会导致路径不正确,获取request方法失败。所以requireFileAsExpression方法中针对windows操作系统的路径需特殊处理:调用JSON.stringify包裹文件地址JSON.stringify(options.requestAbsPath),才会拿到正确的路径。
最后,前端项目中使用上述mp-gq-loader时,可在webpack config中加入如下配置:
{test:/\.(graphql|gql)$/,
exclude:/node_modules/,
use:{
loader:‘@iqiyi/mp-gq-loader’,
options:{
url:buildDir==‘dist’?‘https://renzheng.qiyi.domain/apis/adminApi/3.0/graphql’:‘http://renzheng-test.qiyi.domain/apis/adminApi/3.0/graphql’,urlVideo:‘http://vd.qiyi.domain/apis/adminApi/3.0/graphql’,
requestAbsPath:require.resolve(Request2Path)
}
}。
本发明实施例提供的技术方案,通过首先获取GraphQL端点URl地址,之后,通过解析目标GraphQL文件获取query和/或mutation操作参数,再然后,根据上述得到的GraphQL端点URL地址和query或者mutation操作参数,生成用于导出GraphQL的HTTP请求函数的JS代码,最后,前端项目中可直接通过上述loader调用GraphQL接口。这一技术方案,通过配置webpack中的loader来实现GraphQL接口的调用,实现了简化开发人员的开发过程,避免在前端调用接口时,手动拼接接口格式和接口参数的繁琐操作。
参见图6,为本发明实施例提供的一种GraphQL接口的调用装置的实施例框图。如图6所示,该装置包括:
获取模块61,用于获取目标GraphQL文件;
确定模块62,用于根据所述目标GraphQL文件确定GraphQL接口参数集;
拼接模块63,用于将所述GraphQL接口参数集中的GraphQL接口参数进行拼接,生成JS代码,以通过执行所述JS代码生成用于调用所述GraphQL接口的HTTP请求。
在一个可能的实施方式中,所述确定模块62,包括(图中未示出):
读取子模块,用于读取所述目标GraphQL文件的指定位置处的数据,根据读取到的数据确定GraphQL端点URL地址;
第一确定子模块,用于根据所述目标GraphQL文件确定操作参数;
第二确定子模块,用于将所述GraphQL端点URL地址和所述操作参数分别确定为一项GraphQL接口参数,并归入GraphQL接口参数集。
在一个可能的实施方式中,所述读取子模块,具体用于:
若读取到的数据为URL地址,则将读取到的数据确定为GraphQL端点URL地址;
或者,若读取到的数据为URL地址标识,则从指定文件中确定与所述URL地址标识对应的URL地址;将所述对应的URL地址确定为GraphQL端点URL地址。
在一个可能的实施方式中,所述第一确定子模块,包括(图中未示出):
确定单元,用于确定所述目标GraphQL文件是否具有依赖文件;
获取单元,用于若确定所述目标GraphQL文件具有依赖文件,则获取所述目标GraphQL文件的依赖文件;
第一提取单元,用于从所述目标GraphQL文件和所述依赖文件中提取操作参数;
第二提取单元,用于若确定所述目标GraphQL文件不具有依赖文件,则从所述目标GraphQL文件中提取操作参数。
在一个可能的实施方式中,所述第一提取单元,具体用于:
生成所述目标GraphQL文件的第一抽象语法树,以及生成所述依赖文件的第二抽象语法树;
从所述第一抽象语法树中确定query节点和/或mutation节点;从所述第二抽象语法树中确定fragement节点;
将所述query节点中的数据与所述fragement节点中的数据进行拼接,和/或,将所述mutation节点中的数据与所述fragement节点中的数据进行拼接;
将拼接后的数据作为操作参数。
在一个可能的实施方式中,所述装置还包括(图中未示出):
节点名称确定模块,用于从所述第一抽象语法树中确定query节点和/或mutation节点的节点名称;
接口参数确定模块,用于将所述节点名称确定为一项GraphQL接口参数,并归入GraphQL接口参数集。
在一个可能的实施方式中,所述装置还包括(图中未示出):
方法参数获取模块,用于从指定文件中获取方法参数;
发送模块,用于在执行所述JS代码生成用于调用所述GraphQL接口的HTTP请求之后,根据所述方法参数中的方法,发送所述HTTP请求。
图7为本发明实施例提供的一种电子设备的结构示意图,图7所示的电子设备700包括:至少一个处理器701、存储器702、至少一个网络接口704和其他用户接口703。电子设备700中的各个组件通过总线系统705耦合在一起。可理解,总线系统705用于实现这些组件之间的连接通信。总线系统705除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图7中将各种总线都标为总线系统705。
其中,用户接口703可以包括显示器、键盘或者点击设备(例如,鼠标,轨迹球(trackball)、触感板或者触摸屏等)。
可以理解,本发明实施例中的存储器702可以是易失性存储器或非易失性存储器,或可包括易失性和非易失性存储器两者。其中,非易失性存储器可以是只读存储器(Read-OnlyMemory,ROM)、可编程只读存储器(ProgrammableROM,PROM)、可擦除可编程只读存储器(ErasablePROM,EPROM)、电可擦除可编程只读存储器(ElectricallyEPROM,EEPROM)或闪存。易失性存储器可以是随机存取存储器(RandomAccessMemory,RAM),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的RAM可用,例如静态随机存取存储器(StaticRAM,SRAM)、动态随机存取存储器(DynamicRAM,DRAM)、同步动态随机存取存储器(SynchronousDRAM,SDRAM)、双倍数据速率同步动态随机存取存储器(DoubleDataRateSDRAM,DDRSDRAM)、增强型同步动态随机存取存储器(Enhanced SDRAM,ESDRAM)、同步连接动态随机存取存储器(SynchlinkDRAM,SLDRAM)和直接内存总线随机存取存储器(DirectRambusRAM,DRRAM)。本文描述的存储器702旨在包括但不限于这些和任意其它适合类型的存储器。
在一些实施方式中,存储器702存储了如下的元素,可执行单元或者数据结构,或者他们的子集,或者他们的扩展集:操作系统7021和应用程序7022。
其中,操作系统7021,包含各种系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务。应用程序7022,包含各种应用程序,例如媒体播放器(MediaPlayer)、浏览器(Browser)等,用于实现各种应用业务。实现本发明实施例方法的程序可以包含在应用程序7022中。
在本发明实施例中,通过调用存储器702存储的程序或指令,具体的,可以是应用程序7022中存储的程序或指令,处理器701用于执行各方法实施例所提供的方法步骤,例如包括:
获取目标GraphQL文件;
根据所述目标GraphQL文件确定GraphQL接口参数集;
将所述GraphQL接口参数集中的GraphQL接口参数进行拼接,生成JS代码,以通过执行所述JS代码生成用于调用所述GraphQL接口的HTTP请求。
上述本发明实施例揭示的方法可以应用于处理器701中,或者由处理器701实现。处理器701可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器701中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器701可以是通用处理器、数字信号处理器(DigitalSignalProcessor,DSP)、专用集成电路(ApplicationSpecific IntegratedCircuit,ASIC)、现成可编程门阵列(FieldProgrammableGateArray,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本发明实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件单元组合执行完成。软件单元可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器702,处理器701读取存储器702中的信息,结合其硬件完成上述方法的步骤。
可以理解的是,本文描述的这些实施例可以用硬件、软件、固件、中间件、微码或其组合来实现。对于硬件实现,处理单元可以实现在一个或多个专用集成电路(ApplicationSpecificIntegratedCircuits,ASIC)、数字信号处理器(DigitalSignalProcessing,DSP)、数字信号处理设备(DSPDevice,DSPD)、可编程逻辑设备(ProgrammableLogicDevice,PLD)、现场可编程门阵列(Field-ProgrammableGateArray,FPGA)、通用处理器、控制器、微控制器、微处理器、用于执行本申请所述功能的其它电子单元或其组合中。
对于软件实现,可通过执行本文所述功能的单元来实现本文所述的技术。软件代码可存储在存储器中并通过处理器执行。存储器可以在处理器中或在处理器外部实现。
本实施例提供的电子设备可以是如图7中所示的电子设备,可执行如图1~5中GraphQL接口的调用方法的所有步骤,进而实现图1~5所示GraphQL接口的调用方法的技术效果,具体请参照图1~5相关描述,为简洁描述,在此不作赘述。
本发明实施例还提供了一种存储介质(计算机可读存储介质)。这里的存储介质存储有一个或者多个程序。其中,存储介质可以包括易失性存储器,例如随机存取存储器;存储器也可以包括非易失性存储器,例如只读存储器、快闪存储器、硬盘或固态硬盘;存储器还可以包括上述种类的存储器的组合。
当存储介质中一个或者多个程序可被一个或者多个处理器执行,以实现上述在电子设备侧执行的GraphQL接口的调用方法。
所述处理器用于执行存储器中存储的GraphQL接口的调用程序,以实现以下在电子设备侧执行的GraphQL接口的调用方法的步骤:
获取目标GraphQL文件;
根据所述目标GraphQL文件确定GraphQL接口参数集;
将所述GraphQL接口参数集中的GraphQL接口参数进行拼接,生成JS代码,以通过执行所述JS代码生成用于调用所述GraphQL接口的HTTP请求。
专业人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种GraphQL接口的调用方法,其特征在于,所述方法包括:
获取目标GraphQL文件;
根据所述目标GraphQL文件确定GraphQL接口参数集;
将所述GraphQL接口参数集中的GraphQL接口参数进行拼接,生成JS代码,以通过执行所述JS代码生成用于调用所述GraphQL接口的HTTP请求。
2.根据权利要求1所述的方法,其特征在于,所述根据所述目标GraphQL文件确定GraphQL接口参数集,包括:
读取所述目标GraphQL文件的指定位置处的数据,根据读取到的数据确定GraphQL端点URL地址;
根据所述目标GraphQL文件确定操作参数;
将所述GraphQL端点URL地址和所述操作参数分别确定为一项GraphQL接口参数,并归入GraphQL接口参数集。
3.根据权利要求2所述的方法,其特征在于,所述根据读取到的数据确定GraphQL端点URL地址,包括:
若读取到的数据为URL地址,则将读取到的数据确定为GraphQL端点URL地址;
或者,若读取到的数据为URL地址标识,则从指定文件中确定与所述URL地址标识对应的URL地址;将所述对应的URL地址确定为GraphQL端点URL地址。
4.根据权利要求2所述的方法,其特征在于,所述根据所述目标GraphQL文件确定操作参数,包括:
确定所述目标GraphQL文件是否具有依赖文件;
若是,则获取所述目标GraphQL文件的依赖文件;从所述目标GraphQL文件和所述依赖文件中提取操作参数;
若否,则从所述目标GraphQL文件中提取操作参数。
5.根据权利要求4所述的方法,其特征在于,所述从所述目标GraphQL文件和所述依赖文件中提取操作参数,包括:
生成所述目标GraphQL文件的第一抽象语法树,以及生成所述依赖文件的第二抽象语法树;
从所述第一抽象语法树中确定query节点和/或mutation节点;从所述第二抽象语法树中确定fragement节点;
将所述query节点中的数据与所述fragement节点中的数据进行拼接,和/或,将所述mutation节点中的数据与所述fragement节点中的数据进行拼接;
将拼接后的数据作为操作参数。
6.根据权利要求5所述的方法,其特征在于,所述方法还包括:
从所述第一抽象语法树中确定query节点和/或mutation节点的节点名称;
将所述节点名称确定为一项GraphQL接口参数,并归入所述GraphQL接口参数集。
7.根据权利要求1所述的方法,其特征在于,所述方法还包括:
从指定文件中获取方法参数;
在执行所述JS代码生成用于调用所述GraphQL接口的HTTP请求之后,根据所述方法参数中的方法,发送所述HTTP请求。
8.一种GraphQL接口的调用装置,其特征在于,所述装置包括:
获取模块,用于获取目标GraphQL文件;
确定模块,用于根据所述目标GraphQL文件确定GraphQL接口参数集;
拼接模块,用于将所述GraphQL接口参数集中的GraphQL接口参数进行拼接,生成JS代码,以通过执行所述JS代码生成用于调用所述GraphQL接口的HTTP请求。
9.一种电子设备,其特征在于,包括:处理器和存储器,所述处理器用于执行所述存储器中存储的一种GraphQL接口的调用程序,以实现权利要求1~7中任一项所述的GraphQL接口的调用方法。
10.一种存储介质,其特征在于,所述存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现权利要求1~7中任一项所述的GraphQL接口的调用方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210578540.2A CN114911472A (zh) | 2022-05-25 | 2022-05-25 | GraphQL接口的调用方法、装置、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210578540.2A CN114911472A (zh) | 2022-05-25 | 2022-05-25 | GraphQL接口的调用方法、装置、电子设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114911472A true CN114911472A (zh) | 2022-08-16 |
Family
ID=82769499
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210578540.2A Pending CN114911472A (zh) | 2022-05-25 | 2022-05-25 | GraphQL接口的调用方法、装置、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114911472A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117009110A (zh) * | 2023-08-30 | 2023-11-07 | 中国人民解放军陆军工程大学 | 一种基于描述信息的接口动态调用方法 |
-
2022
- 2022-05-25 CN CN202210578540.2A patent/CN114911472A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117009110A (zh) * | 2023-08-30 | 2023-11-07 | 中国人民解放军陆军工程大学 | 一种基于描述信息的接口动态调用方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP3876116B1 (en) | Method and apparatus for running mini program, electronic device, and storage medium | |
CN109976761B (zh) | 软件开发工具包的生成方法、装置及终端设备 | |
US8150939B1 (en) | Method and system for wrapping and componentizing javascript centric widgets using java components | |
US20180121320A1 (en) | Analysis to check web api code usage and specification | |
TWI536263B (zh) | 將作業系統之原始應用程式介面投射至其它程式語言 | |
US10459708B2 (en) | Composing a module system and a non-module system | |
US10078497B2 (en) | Bridging a module system and a non-module system | |
US20070256069A1 (en) | Dependency-based grouping to establish class identity | |
US11074154B2 (en) | Identifying a source file for use in debugging compiled code | |
US9442717B2 (en) | Techniques for automatically identifying input files used to generate output files in a software build process | |
US10417024B2 (en) | Generating verification metadata and verifying a runtime type based on verification metadata | |
JP2006065861A (ja) | 継ぎ目なくオブジェクトを比較するシステムおよび方法 | |
TW201308209A (zh) | 運行時間系統 | |
US10083029B2 (en) | Detect application defects by correlating contracts in application dependencies | |
US20230315416A1 (en) | Code translation method and apparatus, and device | |
US8606766B2 (en) | Method and system to handle java class versioning | |
CN112416710A (zh) | 用户操作的记录方法、装置、电子设备及存储介质 | |
CN114911472A (zh) | GraphQL接口的调用方法、装置、电子设备及存储介质 | |
CN116028028A (zh) | 请求函数生成方法、装置、设备及存储介质 | |
US11288044B1 (en) | System and method for interprocedural analysis | |
CN109032572B (zh) | 一种基于字节码的java程序方法内联的方法 | |
US11341154B2 (en) | Normalizing encodings of requested data from a common data schema to a target data schema | |
CN111273940B (zh) | 将程序文件上传至代码仓库的方法及装置 | |
JP2022542007A (ja) | テスト・ベクタを使用した高水準コンストラクトの最適化の自動検証 | |
US20240184553A1 (en) | Modifying bytecode to return an address associated with a target function |
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 |