作者:穿行印象
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:
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/
查看其WSDL,并且保存成文件,以备后用(截图不全):
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方法为例,将getFlights和getFlight两个SOAP服务映射为OData服务。
1. Ecplipse中创建一个OData Service Implementation Project
2. 这个Project中新建一个OData Model,名字为S2O.
3. QUERY的映射
Endpoint:
http://localhost:8888/axis2/services/MyAirlineService.MyAirlineServiceHttpSoap
Namespace:
Operation:
getFlights
PortType:
MyAirlineServicePortType
这些信息在SOAP的WSDL中可以找到。
返回结果集映射好之后,需要使用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 类:
需要我们自己完成对过滤条件的提取与转换。我的代码是这样的:
之后测试一下如下URI:
http://localhost:8080/gateway/odata/sap/MyS2O;v=1/FlightSet?$filter=AirlineID eq 1
测试结果:
4. READ的映射
http://localhost:8080/gateway/odata/sap/MyS2O;v=1/FlightSet(AirlineID=0,FlightID=1)
之后定义SOAP服务的返回结果与OData实体的对应关系:
http://localhost:8080/gateway/odata/sap/MyS2O;v=1/FlightSet(AirlineID=1,FlightID=2)
来精确获取AirlineID=1且FlightID=2的Flight信息了: