报文的解析方法及装置与流程

文档序号:16062354发布日期:2018-11-24 12:19阅读:715来源:国知局
本说明书一个或多个实施例涉及计算机
技术领域
,尤其涉及一种报文的解析方法及装置。
背景技术
在网络通信的过程中,通信网关通常需要解析不同格式的报文,该不同的格式例如可以为可扩展标记语言(extensiblemarkuplanguage,xml)格式、js对象简谱(javascriptobjectnotation,json)格式、流式等等。对不同格式的报文,通常需要通过不同的解析方式进行解析。例如,开发人员可以针对每种不同格式的报文编写对应的groovy(一种基于java虚拟机的敏捷开发语言)脚本,来对不同格式的报文进行解析。因此,需要提供一种更通用的报文解析方案。技术实现要素:本说明书一个或多个实施例描述了一种报文的解析方法及装置,可以提高报文解析的通用性。第一方面,提供了一种报文的解析方法,包括:接收待解析报文;获取与所述待解析报文对应的报文配置信息;所述报文配置信息是根据与所述待解析报文相匹配的样例报文确定的;所述报文配置信息包括报文的报文格式、报文中所包含的各个字段以及所述字段在报文中的位置;根据所述报文格式,调用对应的数据获取接口,以根据所述位置获取所述各个字段在所述待解析报文中对应的字段值;所述数据获取接口中定义了用于根据位置获取字段的字段值的方法;将所述各个字段的字段值转化为固定格式的数据;输出所述固定格式的数据。第二方面,提供了一种报文的解析装置,包括:接收单元,用于接收待解析报文;获取单元,用于获取与所述接收单元接收的所述待解析报文对应的报文配置信息;所述报文配置信息是根据与所述待解析报文相匹配的样例报文确定的;所述报文配置信息包括报文的报文格式、报文中所包含的各个字段以及所述字段在报文中的位置;调用单元,用于根据所述获取单元获取的所述报文格式,调用对应的数据获取接口,以根据所述位置获取所述各个字段在所述待解析报文中对应的字段值;所述数据获取接口中定义了用于根据位置获取字段的字段值的方法;转化单元,用于将所述各个字段的字段值转化为固定格式的数据;输出单元,用于输出所述转化单元转化的所述固定格式的数据。本说明书一个或多个实施例提供的报文的解析方法及装置,接收待解析报文。获取与待解析报文对应的报文配置信息。该报文配置信息包括报文的报文格式、报文中所包含的各个字段以及字段在报文中的位置。根据报文格式,调用对应的数据获取接口,以根据位置获取各个字段在待解析报文中对应的字段值。将各个字段的字段值转化为固定格式的数据。输出该固定格式的数据。由此可知,本说明书提供的解析方法通过调用预先定义的与报文格式相对应的接口,实现对不同报文格式的报文进行解析。因此,本说明书提供的解析方法具有通用性。附图说明为了更清楚地说明本说明书实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。图1为本说明书提供的报文的解析方法的应用场景示意图;图2为本说明书提供的各接口之间的关系示意图;图3为本说明书一个实施例提供的报文的解析方法流程图;图4为本说明书一个实施例提供的报文的解析装置示意图。具体实施方式下面结合附图,对本说明书提供的方案进行描述。本说明书提供的报文的解析方法可以应用于如图1所示的场景中,图1中,通信网关可以接收来自不同业务系统的报文。这些报文可以具有不同的报文格式,如,xml格式、json格式以及流式等等。其中,xml格式、json格式的报文也可以统称为结构化报文,而流式的报文可以简称为流式报文。对这些报文,为了获取相应的数据或者文本内容,通信网关可以对其进行解析。在执行本说明实施例提供的报文的解析方法之前,可以预先定义与报文相关的属性,该预定义属性可以包括但不限于以下一种或多种:用于描述报文格式的属性、用于描述字段信息的属性以及用于描述安全校验信息的属性等等。在一个例子中,预先定义的用于描述报文格式的属性可以如表1所示。表1属性说明msgid报文配置的唯一主键msgformatxml格式、json格式以及流式等预先定义的用于描述字段信息的属性可以如表2所示。此处的字段信息可以包括字段id、字段路径、字段在数据对象中的位置、字段类型以及父节点等。此处的位置可以为标记化路径,也可以为固定位置,后续进行详细说明。表2预先定义的用于描述安全校验信息的属性可以如表3所示。此处的安全校验信息可以包括数字签名内容和被签名内容。此外,该安全校验信息还可以包括签名算法等。表3在预定义了与报文相关的属性之后,为确定该多个预定义属性的属性值,可以人为预先收集多种不同类型的样例报文。以结构化报文为例来说,不同类型的样例报文可以是指各样例报文中的节点(节点的概念后续进行说明)和/或节点位置不相同。之后,根据每种样例报文配置上述预定义属性的属性值。需要说明的是,对于表1和表2中的预定义属性,可以自动化完成配置。对于表3中的预定义属性,可以人工协助配置。以配置fieldid以及srcpath的属性值为例来说,可以先从样例报文中识别各个字段。假设当前样例报文为xml格式,且该xml格式的样例报文如下:在如上的xml格式的样例报文中,可以将一个标签对(包括起始标签和结束标签)称为一个节点。则上述xml格式的样例报文中的节点例如可以为:<request></request>、<head></head>以及<funcion></function>等。需要说明的是,若与某个节点对应的标签对中嵌套了其它的标签对,则该节点称为非叶子节点。与嵌套的标签对对应的节点称为该节点的子节点。相应的,该节点为该子节点的上层节点。而若与某个节点对应的标签对中没有嵌套其它的标签对,则该节点称为叶子节点。在一种实现方式中,可以将xml格式的报文中的叶子节点识别为字段。可以理解的是,该xml格式的样例报文中包含了四个字段,分别为:<funcion></function>、<appid></appid>、<name></name>以及<certno></certno>。可以理解的是,在从xml格式的样例报文中识别出各个字段之后,就可以确定fieldid以及srcpath的属性值。对于srcpath的属性值,可以根据与字段对应的叶子节点的多个上层节点确定。如前述例子,对字段:<funcion></function>,srcpath的属性值可以为:request.head.function。需要说明的是,对于xml格式的样例报文,srcpath的属性值也可以称为字段的标记化路径。对于json格式的报文,由于其通常是由具有嵌套关系的数组(由方括号进行标记)构成。因此,可以将每个数组称为一个节点(或者数组节点)。而将未嵌套其它数组的数组称为叶子节点,并将该叶子节点识别为字段。在从json格式的样例报文中识别出各个字段之后,就可以确定fieldid以及srcpath的属性值。对于srcpath的属性值,同样可以根据与字段对应的叶子节点的多个上层节点(该上层节点也为数组)确定。需要说明的是,对于json格式的报文,srcpath的属性值也可以称为字段的标记化路径。对于流式的报文,字段可以是指流式的样例报文中的固定长度的数据。对于srcpath的属性值,其可以包括上述固定长度的起始位置(start)和结束位置(end)。可以理解的是,针对每种样例报文,完成上述表1-表3中的预定义属性的属性值的配置之后,与该种样例报文对应的报文配置信息就可以确定了。该报文配置信息可以包括报文的报文格式(即msgformat的属性值)、报文中所包含的各个字段(即fieldid的属性值)以及各个字段在报文中的位置(即srcpath的属性值)。此外,为了能实现对某些对报文进行安全性校验,上述报文配置信息还可以包括报文的数字签名内容在报文中的位置(即signnode的属性值)以及被签名内容在报文中的位置(即unsignnode的属性值)。需要说明的是,由于表1-表3中均包括了属性:msgid,也即针对每种样例报文,可以配置与其对应的msgid,从而该msgid可以用于唯一地标识一种样例报文。此外,由于对于不同的样例报文,其对应的报文配置信息通常也是不同的。因此,与每种样例报文对应的报文配置信息也可以通过该种样例报文的msgid进行标识。为实现对报文进行操作,本说明书针对不同报文格式的报文,还定义了相对应的数据获取接口和文本获取接口。其中,数据获取接口中又定义了用于根据位置获取字段的字段值的方法。文本获取接口中又定义了用于根据位置获取文本内容的方法。需要说明的是,通过调用上述数据(文本)获取接口,可以获取不同报文格式的报文的数据(文本),由此可以提高报文的解析方法的通用性。在一个例子中,本说明书定义的数据获取接口、文本获取接口以及二者之间的继承关系可以如图2所示。图2中,structmessageparser为与结构化报文相对应的文本获取接口,streammessageparser为与流式报文相对应的文本(或数据)获取接口。该两个接口均继承了messageparser中的方法。structmessage为与结构化报文相对应的数据获取接口,其继承了structmessageparser中的方法。需要说明的是,图2中的messageparser具体可以如表4所示。表4图2中的structmessageparser具体可以如表5所示。表5图2中的structmessage具体可以如表6所示。表6方法说明getvalue(path)通过位置获取节点值getvalue()获取本节点的节点值iterator遍历本数组节点下的所有节点isarray判断本节点是否是数组节点需要说明的是,由于structmessage继承了structmessageparser中的方法,也即其具有表5和表6中的所有方法。其中,getnode和getvalue()统称为用于根据位置获取字段的字段值的方法。图2中的streammessageparser具体可以如表7所示。表7可以理解的是,通过对数据获取接口或者文本获取接口的调用,就可以实现对不同报文格式的报文进行解析。图3为本说明书一个实施例提供的报文的解析方法流程图。所述方法的执行主体可以为图1中的通信网关。如图3所示,所述方法具体可以包括:步骤310,接收待解析报文。此处的待解析报文可以是由通信网关从业务系统接收的。该待解析报文的报文格式可以包括但不限于xml格式、json格式以及流式等等。假设该待解析报文为xml格式,且该xml格式的待解析报文如下:步骤320,获取与待解析报文对应的报文配置信息。在一种实现方式中,可以首先从待解析报文中识别报文标识。之后可以将该报文标识与不同类型的样例报文对应的报文配置信息的msgid进行比对。若与任一种样例报文对应的报文配置信息的msgid比对一致,则将该任一种样例报文对应的报文配置信息作为待解析报文对应的报文配置信息。而该任一种样例报文即为与待解析报文相匹配的样例报文。在本说明书中,待解析报文与相匹配的样例报文属于相同类型的报文。以结构化报文为例来说,相同类型的报文所包含的节点以及节点的位置相同。步骤330,根据报文格式,调用对应的数据获取接口,以根据位置获取各个字段在待解析报文中对应的字段值。需要说明的是,对结构化报文,可以将与叶子节点对应的数据称为字段值(也称节点值)。以xml格式的报文为例来说,该数据可以包含在与叶子节点对应的起始标签和结束标签之间。需要说明的是,上述字段值通常是通过解析工具对结构化报文进行解析后得到的。该解析工具为传统常用工具,其用于根据结构化报文的语法规则,对报文进行解析。可选地,为了提高安全性,在执行步骤330之前,可以先执行如下的步骤:步骤a,根据报文格式,调用对应的文本获取接口,以根据数字签名内容以及被签名内容的位置,获取待解析报文的数字签名内容以及被签名内容。以报文格式为xml格式或者json格式为例来说,可以调用structmessageparser。具体地,可以是通过调用structmessageparser中的getcontentbynode方法,来获取数字签名内容以及被签名内容。假设上述待解析报文还包括如下内容:<xml><request>…</request><signature>##signaturecontent</signature></xml>假设该待解析报文的报文配置信息中的数字签名内容的位置为:signature,被签名内容的位置为:request。则获取到的待解析报文的数字签名内容可以为:##signaturecontent。而被签名内容可以为:<request>与</request>之间的所有文本内容。如前述例子,该被签名内容可以为:<head><funcion>interface1.test</function><appid>shbank1</appid></head><body><name>jack1</name><certno>243252453453451</certno></body>。对于流式报文,可以调用streammessageparser。具体地,可以是通过调用streammessageparser中的getvalue方法,来获取待解析报文的数字签名内容以及被签名内容。步骤b,根据数字签名内容以及被签名内容以及预定义的签名算法对待解析报文进行安全性校验。此处,根据数字签名内容、被签名内容以及预定义的签名算法对待解析报文进行安全性校验为传统常规技术,在此不复赘述。可以理解的是,在还对待解析报文进行安全性校验时,则可以在安全性校验通过时,执行步骤330。步骤330中,以报文格式为xml格式为例来说,可以调用structmessage。具体地,可以是通过调用structmessage中的getnode和getvalue()方法,来获取待解析报文的各个字段的字段值。在一种实现方式中,该获取过程具体可以为:对每个字段,获取该字段在报文中的位置所包含的最上层节点。判断该最上层节点是否为叶子节点。如果是,则调用getvalue()方法,从待解析报文中获取对应的节点值。如果否,则调用getnode方法,获取最上层节点的子节点(该子节点的类型为structmessage),并对该子节点执行上述判断的操作;以此类推,直至从待解析报文中获取到对应的节点值。将获取的节点值作为该字段的字段值。以字段为:<funcion></function>,字段在报文中的位置为:request.head.function为例来说,该位置包含的最上层节点为:request。由于request为非叶子节点,可以调用getnode方法,获取对应的子节点:head。而head也为非叶子节点,可以继续调用getnode方法,获取对应的子节点:function。由于function为叶子节点,可以调用getvalue()方法,获取对应的节点值:interface1.test,从而该字段的字段值获取过程结束。同理可以获取到,其它字段:<appid></appid>、<name></name>以及<certno></certno>在待解析报文中对应的字段值。需要说明的是,上述判断的操作可以由对应的解析工具执行。以报文格式为流式为例来说,可以调用streammessageparser。具体地,可以是通过调用streammessageparser中的getvalue(start,end)方法,来从待解析报文中获取各个字段的字段值。步骤340,将各个字段的字段值转化为固定格式的数据。如,可以将各个字段的字段值转化为map格式的数据。此处的map格式的数据可以通过键值对(key-value)的形式表示。其中,key值可以根据表3中的属性:destpath确定,而value即为字段值。上述转化过程也可以称为字段映射。步骤350,输出固定格式的数据。综上,本说明书对报文的解析过程进行了抽象,并将报文描述为字段集合,提炼出一种通用的解析过程,能够对不同格式的报文(包括结构化报文和流式报文)进行安全校验和解析,并转化为固定格式的数据。此外,由于本说明书对报文的解析过程进行了抽象,从而安全校验、字段映射与报文格式之间实现了解耦。相比传统的编写groovy脚本的方案,降低了报文的解析过程的代码维护成本,提高了可扩展性和代码稳定性。与上述报文的解析方法对应地,本说明书一个实施例还提供的一种报文的解析装置,如图4所示,该装置包括:接收单元401,用于接收待解析报文。获取单元402,用于获取与接收单元401接收的待解析报文对应的报文配置信息。该报文配置信息是根据与待解析报文相匹配的样例报文确定的。该报文配置信息包括报文的报文格式、报文中所包含的各个字段以及各个字段在报文中的位置。该报文配置信息可以是根据多个预定义属性的属性值确定的,该预定义属性可以包括以下一种或多种:用于描述报文格式的属性、用于描述字段信息的属性以及用于描述安全校验信息的属性。上述报文格式可以包括:可扩展标记语言xml格式、js对象简谱json格式以及流式。当报文格式为xml格式或者json格式时,字段可以是指xml格式或者json格式的报文中的叶子节点。字段的位置可以是指由叶子节点的多个上层节点构成的标记化路径。当报文格式为流式时,字段可以是指流式的报文中的固定长度的数据。字段的位置可以是指由固定长度的起始位置和结束位置构成的固定位置。调用单元403,用于根据获取单元402获取的报文格式,调用对应的数据获取接口,以根据位置获取各个字段在待解析报文中对应的字段值。数据获取接口中定义了用于根据位置获取字段的字段值的方法。转化单元404,用于将各个字段的字段值转化为固定格式的数据。输出单元405,用于输出转化单元404转化的固定格式的数据。可选地,上述报文配置信息还可以包括报文的数字签名内容以及被签名内容在报文中的位置。该装置还可以包括:校验单元406。调用单元403,还用于根据报文格式,调用对应的文本获取接口,以获取待解析报文的数字签名内容以及被签名内容。文本获取接口中定义了用于根据位置获取文本内容的方法。校验单元406,用于根据待解析报文的数字签名内容、被签名内容以及预定义的签名算法对待解析报文进行安全性校验。可选地,当报文格式为可扩展标记语言xml格式或者js对象简谱json格式时,用于根据位置获取字段的字段值的方法可以包括第一方法和第二方法。其中,第一方法用于通过位置获取子节点,第二方法用于获取本节点的节点值。调用单元403具体可以用于:对每个字段,获取该字段在报文中的位置所包含的最上层节点。判断最上层节点是否为叶子节点。如果是,则调用第二方法,从待解析报文中获取对应的节点值。如果否,则调用第一方法,获取最上层节点的子节点,并对该子节点执行上述判断的操作;以此类推,直至从待解析报文中获取到对应的节点值。将获取的节点值作为字段的字段值。本说明书上述实施例装置的各功能模块的功能,可以通过上述方法实施例的各步骤来实现,因此,本说明书一个实施例提供的装置的具体工作过程,在此不复赘述。本说明书一个实施例提供的报文的解析装置,接收单元401接收待解析报文。获取单元402获取与待解析报文对应的报文配置信息。调用单元403根据报文格式,调用对应的数据获取接口,以根据位置获取各个字段在待解析报文中对应的字段值。转化单元404将各个字段的字段值转化为固定格式的数据。输出单元405输出固定格式的数据。由此,可以提高报文解析的通用性。需要说明的是,本说明书实施例提供的报文的解析装置可以为图1中通信网关的一个模块或者单元。本领域技术人员应该可以意识到,在上述一个或多个示例中,本说明书所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。以上所述的具体实施方式,对本说明书的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本说明书的具体实施方式而已,并不用于限定本说明书的保护范围,凡在本说明书的技术方案的基础之上,所做的任何修改、等同替换、改进等,均应包括在本说明书的保护范围之内。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1