利用Web Service实现SAP PORTAL与异构系统的集成
王建文
东方电气中央研究院信息化所 四川成都 611731
摘要:目前,越来越多的中国大型企业在信息化建设中采用了SAP的系统作为主干平台,但是因为种种原因,这些企业都存在信息资源整合的问题。首先,很多企业在使用SAP的系统前,已经使用过其它的信息平台,旧平台中的数据不能简单地废除;其次,大型企业的下属各单位可能采用的并非SAP的系统;再次,一个大型企业往往有多个信息化系统,这些系统之间则需要进行数据交流。所以,对于使用SAP平台的企业来讲,大量的集成工作是难免的。本文将以实例,来介绍利用Web Service技术实现SAP PORTAL与异构系统集成的工作。
关键词:SAP;PORTAL;Web Service;集成
0 引言
信息化系统不仅是企业运营的工具,也是企业管理的宝贵资源。自“十五计划”提出“加速发展信息产业,大力推进信息化”以来,中国企业的信息化建设经历了十余年的高速发展期。在此背景下,SAP的产品成为了许多企业的选择。而系统集成与信息化资源的整合,成为这些企业在部署SAP系统的过程中难以回避的问题:
许多企业在采用SAP的产品之前,往往已经使用了一些其他的信息化系统(如金蝶、用友、Oracle等)。这些旧的信息化系统可能已经使用多年,存有大量数据。对于企业而言,丢弃多年的数据是巨大的损失,所以最好的方法是实现旧系统到新系统的平稳过渡。然而,靠手动的方式转移大量数据并不现实,通过集成技术将旧系统的数据抽取并录入新系统就成了一项很有必要的工作。
此外,一些企业可能在部署SAP的不同模块前就已经面临着“信息孤岛”的问题,即子企业和各部门的系统各自为阵,无法实现业务联系、数据整合。鉴于部署SAP系统的成本问题(淘汰和替换原有系统的成本)和SAP产品本身的技术限制(一些专业软件很难被完全替代),集成工作无法避免。
鉴于上述情况,许多部署SAP产品的信息化团队都在积极探索合适的集成手段,常见的技术包括物理数据库直连,COM串口,XI,IDOC,Web Service,BAPI/RFC等。本文将结合实例介绍SAP的平台利用Web Service进行集成的方法。
1 背景
自本集团采用了一卡通系统以来,饭卡余额与消费记录就成为企业员工非常关心的问题。然而,一卡通系统本身,并不存在发布数据的功能。另一方面,本集团的SAP PORTAL系统,可以通过网页的形式向用户提供各种服务。在此情况下,本集团的信息化技术人员开始探索将SAP PORTAL与一卡通系统集成,然后利用网页为用户提供饭卡余额和消费记录查询的服务。
在多次试验后,我们的信息化技术人员决定采用Web Service技术实现集成的工作。Web Service是一种独立于硬件平台、编程语言、客户端分布的程序通信标准,也可以被理解为一种应用组件,为其他程序提供数据与服务。
图 1 Web Service工作原理示意
2 利用Web Service进行集成
2.1 编写服务器端程序
由于我们的一卡通系统提供了JAVA程序的接口,所以我们决定使用JAVA语言来编写服务器端的程序。在该程序中,我们定义了YKTWebService类,在类中定义了获取用户姓名的函数GetUserName、读取饭卡余额的函数getBalance、读取饭卡消费流水信息的函数GetQueryFlow。这些函数可以通过JAVA程序接口获取一卡通系统中的数据,并以字符串的形式将结果值返回出来。
2.2 发布Web Service服务
为myEclipse安装Axis2组件(具体安装过程请阅读参考文献《使用Eclipse+Axis2构建Web Service应用》)。如果安装成功,可以在myEclipse的new操作中看到如下的选项:
图 2 Axis2安装成功后将出现的新选项
选择Axis2 Service Archiver,进入创建Web Service过程,我们需要按照Wizard一步一步生成Web Service的文件。首先,我们需要给出Class文件所在位置,然后选择wsdl文件类型(通常选择Skip WSDL)。如果没有外部jar使用,则跳过选择jar的界面。接下来我们需要选择xml页面,这里需要勾选Generate the service xml automatically选项。再接下来我们需要输入要发布的service名称,以及完整的JAVA类名称。比如我们这里定义service名称为YKTService,类名称为com.dongfang.service.ykt.YKTWebService(这里的com.dongfang.service.ykt为包名,YKTWebService为前面所定义的类名,它们按照包名.类名的方式组成完整的JAVA类名称)。最后我们需要给出生成文件的地址。完成这些步骤后,将在目标地址生成一个aar文件。
将该aar文件复制到Tomcat的Axis的service文件夹下,比如我们这里采用的C:\tomcat\apache-tomcat-7.0.40\webapps\axis2\WEB-INF\services,然后重启Tomcat。
图 3 将aar文件拷贝到Axis的服务文件夹下
在在浏览器中按照http://服务器地址:端口号/axis2/services/YKTServer?wsdl的格式输入地址,如果Web Service发布成功,我们将能看到wsdl文件的代码。至此,服务器端工作完成。
图 4 wsdl文件代码
2.3 在SAP系统中生成Web Service代理
接下来即是客户端也就是SAP系统的工作,我们首先需要生成Web Service的代理。首先通过事务代码se80进入到我们要创建代理的Package,然后右键选择Create->Enterprise Service/Web Serivce->Proxy Object。
图 5 进入要创建代理的Package,创建Proxy Object
接下来按照Wizard一步一步来。首先选择Object Type为Consumer Group,然后我们需要选择wsdl文件载入方式为URL/HTTP Destination,并给出wsdl文件的完整网络地址,也就是上一章中的http://服务器地址:端口号/axis2/services/YKTServer?wsdl地址。接下来我们需要输入包名和前缀名,包名即这里的Package名称,前缀名可以任意命名,这里我们命名为ZCARD_。完成全部操作后,我们会发现Package里出现了Enterprise Service选项,里面包含了代理类及其用到的数据类型。我们需要保存并激活Enterprise Service选项。
这里我们生成的代理类名称是ZCARD_CO_YKTSERVER_PORT_TYPE,这个类将在编写客户端程序的ABAP代码中用到。此外,通过Used Objects选项,我们可以查看各个函数传参和返回值对应的ABAP数据类型,双击这些类型,我们可以看到这些类型内部的字段。比如,双击ZCARD_GET_BALANCE_RESPONSE,可以看到字段RETURN,说明这个类型对应的是getBalance函数的返回值。
图 6 传参和返回值对应的ABAP数据类型
图 7 ZCARD_GET_BALANCE_RESPONSE类型包含的字段RETURN
而在Internal View选项中,我们可以看到JAVA函数在SAP系统中对应的名字,比如这里getBalance函数对应GET_BALANCE、GetUserName函数对应GET_USER_NAME、GetQueryFlow函数对应GET_QUERY_FLOW。
图 8 JAVA函数度应的SAP ABAP函数
上述的类名、数据类型和函数名,将帮助我们完成客户端程序的编写。
2.4 设置逻辑端口
Web Service代理要正常工作,还需要设置逻辑端口。我们首先输入事务代码lpconfig,进入设置逻辑端口的界面。输入代理类的名称(ZCARD_CO_YKTSERVER_PORT_TYPE),以及逻辑端口名称(这里是ZCARD_HTTP80)。如果希望创建代理类时可以不专门输入逻辑端口名称,还可以勾上缺省端口选项。
图 9 设置逻辑端口的界面
选择创建,进入设置界面。在设置界面里,我们需要给出逻辑端口的描述。然后在运行时间页面中选择Web服务基础结构。接下来在调用参数界面中给出wsdl文件的网络地址(http://服务器地址:端口号/axis2/services/YKTServer?wsdl)。激活设置,即完成了逻辑端口配置。
2.5 编写客户端程序
最后一步工作,就是用ABAP语言编写客户端的程序。对于一个面向用户的实用性程序而言,我们还要用到很多与Web Service无关的代码和算法,这里就不过多介绍。仅截取跟Web Service有关的代码进行介绍。
首先,我们需要定义代理类、传参和返回值的对应类、Web Service报错类。这里的类名、传参和返回值的类,都在2.3节中有过介绍。报错类则通常包括两种:cx_ai_system_fault系统错误、cx_ai_application_fault应用错误。
定义数据对象的代码如下:
DATA: z_card_proxy TYPE REF TO ZCARD_CO_YKTSERVER_PORT_TYPE,"一卡通代理类
get_balance_input TYPE ZCARD_GET_BALANCE_REQUEST, "获取余额函数输入参数
get_balance_output TYPE ZCARD_GET_BALANCE_RESPONSE, "获取余额函数返回值
get_query_flow_input TYPE ZCARD_GET_QUERY_FLOW_REQUEST, "获取流水函数输入参数
get_query_flow_output TYPE ZCARD_GET_QUERY_FLOW_RESPONSE, "获取流水函数返回值
get_user_name_input TYPE ZCARD_GET_USER_NAME_REQUEST, "获取用户姓名输入参数
get_user_name_output TYPE ZCARD_GET_USER_NAME_RESPONSE, "获取用户姓名返回值
wa_input TYPE prxctrl.
DATA: webservice_sys_error TYPE REF TO cx_ai_system_fault, "系统错误
webservice_app_error TYPE REF TO cx_ai_application_fault, "应用错误
webservice_num_error TYPE REF TO cx_sy_conversion_no_number. "字符转换数字错误
然后创建代理类。注意,创建代理类需要的logical_port_name参数输入的是前面定义好的逻辑端口号。这里我们创建好了ZCARD_CO_YKTSERVER_PORT_TYPE类型的代理类对象z_card_proxy。有了类对象后,我们就可以调用类的方法了。
创建类对象的代码如下:
FORM set_proxy.
TRY.
CREATE OBJECT z_card_proxy
EXPORTING
logical_port_name = 'ZCARD_HTTP80'.
CATCH cx_ai_system_fault.
ENDTRY.
ENDFORM.
接下来以ZCARD_CO_YKTSERVER_PORT_TYPE类中的GET_USER_NAME方法为例,介绍如何传参和取得返回值。
其代码如下:
FORM get_real_name.
get_user_name_input-cert_code = userid.
TRY.
CALL METHOD z_card_proxy->GET_USER_NAME
EXPORTING
input = get_user_name_input
IMPORTING
output = get_user_name_output.
CATCH cx_ai_system_fault INTO webservice_sys_error.
CATCH cx_ai_application_fault INTO webservice_app_error.
ENDTRY.
user_name = get_user_name_output-return.
IF user_name = 'failed'.
MESSAGE '用户注册信息异常,请联系物业' TYPE 'I'.
ENDIF.
ENDFORM.
首先给get_user_name_input对象(该对象的类型就是前面提到的ZCARD_GET_USER_NAME_REQUEST )的cert_code字段输入值。cert_code字段对应着JAVA函数GetUserName的输入参数certCode,意即用户ID。字段赋好值后,get_user_name_input就可以作为输入参数用于z_card_proxy的方法GET_USER_NAME中。
同理,ZCARD_GET_USER_NAME_RESPONSE类型的数据get_user_name_output就是GET_USER_NAME的输出参数,该参数的return字段对应着JAVA函数GetUserName的return值。这里return值为用户姓名。
这样,我们就可以通过用户登陆的ID获取用户的姓名了。z_card_proxy的其它方法的调用方式也是类似的。
3 结语
作为企业而言,其各个信息化平台并不是相互孤立的,比如财务的平台往往和人力资源的平台关系密切、物料管理的平台往往和采购的平台关系密切......希望通过信息化来提升企业的运营和管理水平,就需要将这些平台整合起来,进行全面的数据挖掘分析。从这个角度讲不同系统间的整合工作比单个信息化平台的搭建更加重要。Web Service作为SAP系统常用的集成技术,不仅仅可以用来集成SAP系统和异构系统,也可以用于其它平台之间的集成工作,在异构系统间共享数据、企业门户建设等领域都非常有用。
参考文献:
[1] 红尘默言 《Java WebService简单实例》[OL] http://www.iteye.com/topic/1135747
[2] 显微外科580580 《java webservice 之Axis2 WebServices总结》[OL] http://jingyan.baidu.com/article/9f7e7ec046b9fd6f281554ca.html
[3 ] panpan3210 《使用Eclipse+Axis2构建Web Service应用》[OL] http://panpan.blog.51cto.com/489034/119204