SMP3.0学习笔记之十七 与非SAP后端系统集成之SOAP WebServices篇

来源:互联网 发布:淘宝大兴宠物怎么样 编辑:程序博客网 时间:2024/05/21 21:37

作者:穿行印象

http://blog.sina.com.cn/s/blog_7a9486880101qr6k.html


上篇尝试使用SMP Integration Gateway将后端的数据库table映射为SMP3.0可以消费的OData服务。这次我使用SMP Integration Gateway将SOAP Webservice服务映射为SMP3.0可以消费的OData服务。

     首先我使用Tomcat7.0+Axis2-1.6.2搭建了一个Webservice服务:

下载Tomcat7:
http://tomcat.apache.org/download-70.cgi
apache-tomcat-7.0.47.exe
安装Tomcat,端口号8888。

下载AXIS2:
http://axis.apache.org/axis2/java/core/download.cgi
axis2-1.6.2-war.zip
axis2-1.6.2-bin.zip

将axis2-1.6.2-war.zip解压之后的axis2.war放到tomcat的webapps目录下,之后使用可以使用如下URL测试AXIS2是否部属成功:
http://192.168.174.129:8888/axis2/

     之后我写了一个简单的Webservice服务: MyAirlineService,其暴露的SOAP方法如下所示:


查看其WSDL,并且保存成文件,以备后用(截图不全):



    在浏览器中分别对上面的几个WebServices方法进行测试,确保WebService工作正常,例如获取airlineID=1的所有航班信息的SOAP返回结果如下:

http://localhost:8888/axis2/services/MyAirlineService/getFlights?airlineID=1



精确获取airlineID=1, flightID=1的航班信息的SOAP结果如下:

http://localhost:8888/axis2/services/MyAirlineService/getFlight?airlineID=1&flightID=1



下面的例子以上面的两个SOAP方法为例,将getFlightsgetFlight两个SOAP服务映射为OData服务。

1. Ecplipse中创建一个OData Service Implementation Project

     项目名称MyS2O:



2. 这个Project中新建一个OData Model,名字为S2O.

     在这个Model中增加2EntitiesFlightAirlineAirline略去不表, 下面的工作主要以Flight实体为例说明如何将后端的getFlightsgetFlight两个方法映射成OData FlightQUERYREAD操作。



3. QUERY的映射

    QUERY就是在OData中可以获取一个实体的数据集的操作,通过QUERY可以使用filter操作进行过滤出自己想要的数据集。

    首先映射Flight的QUERY:





Endpoint:

http://localhost:8888/axis2/services/MyAirlineService.MyAirlineServiceHttpSoap12Endpoint/

Namespace:

http://axis2test.sap.com

Operation:

getFlights

PortType:

MyAirlineServicePortType

这些信息在SOAP的WSDL中可以找到。

 

      SOAP返回的XML的对象属性需要与OData实体的属性有映射,这样才能把SOAP的结果转变为OData格式。SAP GWPA Eclipse插件可以通过拖拽的方式完成这个映射,例如我的getFlights SOAP 结果与OData实体Flight之间的映射关系如下:



返回结果集映射好之后,需要使用java将OData的过滤条件转变为SOAP的过滤条件,比如下面的OData请求:

http://localhost:8080/gateway/odata/sap/MyS2O;v=1/FlightSet?$filter=AirlineID eq 1

 

需要将后面的过滤条件(AirlineID eq 1)提取出来,然后发送给后端的SOAP服务。这就需要使用Java代码来实现。要实现这个功能首先点击QUERY操作的“Define Custom Logic for Request”:


此时会生成一个java 类:



需要我们自己完成对过滤条件的提取与转换。我的代码是这样的:


    发布MyS2O项目到SMP Integration Gateway,然后在Integration Gateway Cockpit中将MyS2O服务激活。之后可以查看转换好的OData服务的metadata:


之后测试一下如下URI:

http://localhost:8080/gateway/odata/sap/MyS2O;v=1/FlightSet?$filter=AirlineID eq 1

测试结果:



4. READ的映射

 

    与QUERY不同的是,OData的READ操作可以精确获取某个指定实体的详细信息。例如类似下面的URI察看AirliineID=0, FlightID=1 的航班信息。
http://localhost:8080/gateway/odata/sap/MyS2O;v=1/FlightSet(AirlineID=0,FlightID=1)
    与QUERY映射相比,READ的映射更加简单,可以直接使用拖拉的方式完成,不需要java代码介入。

    定义READ操作的数据源如下图所示。注意这里的operation是SOAP的getFlight操作,其他与QUERY的数据源相同。


之后定义SOAP服务的返回结果与OData实体的对应关系:

 


    重新部署整个项目到Integration Gateway,并且在Integration Gateway将服务激活。然后就可以使用如下URI

http://localhost:8080/gateway/odata/sap/MyS2O;v=1/FlightSet(AirlineID=1,FlightID=2)

来精确获取AirlineID=1且FlightID=2的Flight信息了:



     至此上面的这个例子完成了OData QUERY、READ操作与SOAP服务的映射。其他的Create, Update和Delete也可以使用类似方法与SOAP服务进行映射。

 

     使用Integration Gateway将SOAP服务映射成OData之后,就可以使用前面讨论的SMP Native OData SDK或者SMP Kapsel开发所需要的移动应用并且通过SMP消费这些OData服务了。



0 0