SAP和Java系统的Webservice实例
2013-05-06 16:35
337 查看
SAP和Java系统的Webservice实例
简介关于Webservice的概念和原理,简单来讲,Webservice是一种基于SOAP传输协议,用WSDL描述,用XML封装数据的接口技术。由于其跨平台、跨防火墙、开发成本低、开发周期短等优势而被广泛应用,但也有局限性,包括传输负载大、没有统一的实现模型等。
对于Webservice在SAP中的应用,多被用在系统同步要求高,数据传输负载小的接口开发上。下面以SAP系统和外部系统的交互为例,SAP ECC系统两个、外部系统一个(Java EJB3 Jboss5),分别讲述从SAP到SAP,SAP到Java,Java到Java,Java到SAP的Webservice实例。
一、SAP系统间的Webservice调用
SE37创建函数z_calculate,类型要设置为RFC类型,参数都设置为传值:
function z_calculate.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(NUMBER1) TYPE STRING
*" VALUE(NUMBER2) TYPE STRING
*" VALUE(OPERATOR) TYPE STRING
*" EXPORTING
*" VALUE(RESULT) TYPE STRING
*"----------------------------------------------------------------------
try .
case operator.
when '+'.
result = number1 + number2.
when '-'.
result = number1 - number2.
when '*'.
result = number1 * number2.
when '/'.
result = number1 / number2.
when others.
result = 'Not supported!'.
endcase.
catch cx_root.
result = 'Not supported!'.
endtry.
condense result.
endfunction.
把函数发布成Webservice
![](http://a.hiphotos.baidu.com/space/pic/item/d8f9d72a6059252d3cac4187349b033b5ab5b9fe.jpg)
![](http://b.hiphotos.baidu.com/space/pic/item/d62a6059252dd42ac1b25d28033b5bb5c8eab8fe.jpg)
![](http://c.hiphotos.baidu.com/space/pic/item/6159252dd42a2834de1d6a885bb5c9ea14cebffe.jpg)
其他一路下来默认,完成后服务已经创建;接下来到SOAMANAGER中去找WSDL的URL,进入到Web service Administration界面,
Apply selection => Overview => Displayselected Binding's WSDL URL,在右边可以看到了。
![](http://e.hiphotos.baidu.com/space/pic/item/c995d143ad4bd113f76bebb15aafa40f4afb058a.jpg)
接下来去SICF中找到服务的Endpoint地址
![](http://d.hiphotos.baidu.com/space/pic/item/242dd42a2834349be8bd3206c9ea15ce37d3befe.jpg)
![](http://e.hiphotos.baidu.com/space/pic/item/d52a2834349b033bb733a05915ce36d3d439bdfe.jpg)
在浏览器中会得到地址:
![](http://b.hiphotos.baidu.com/space/pic/item/0e2442a7d933c89550d8c4f8d11373f08302008a.jpg)
下面进入到Webservice的Client端SAP系统,SE80创建代理类:
![](http://d.hiphotos.baidu.com/space/pic/item/11385343fbf2b2116895d9cdca8065380dd78efe.jpg)
![](http://f.hiphotos.baidu.com/space/pic/item/2934349b033b5bb5246c7c7d36d3d539b700bcfe.jpg)
![](http://g.hiphotos.baidu.com/space/pic/item/1b4c510fd9f9d72a86df4c9ed42a2834359bbbfe.jpg)
在URL栏位输入上面的WSDL的URL
![](http://g.hiphotos.baidu.com/space/pic/item/359b033b5bb5c9eafb485f60d539b6003bf3b3fe.jpg)
激活代理类,然后LPCONFIG创建逻辑端口:
![](http://h.hiphotos.baidu.com/space/pic/item/023b5bb5c9ea15ced955bc8ab6003af33b87b2fe.jpg)
在URL栏位输入上面的Endpoint的URL
![](http://a.hiphotos.baidu.com/space/pic/item/5ab5c9ea15ce36d325bfdfb33af33a87e850b1fe.jpg)
保存后激活,然后回到SE80 测试代理类:
![](http://f.hiphotos.baidu.com/space/pic/item/d043ad4bd11373f00799331ca40f4bfbfaed048a.jpg)
![](http://b.hiphotos.baidu.com/space/pic/item/c8ea15ce36d3d539478653403a87e950342ab0fe.jpg)
已经成功的正确返回结果。也可以以代码的方式访问:
report zyincl_test_00.
data: go_proxy type ref to zco_zsap_calculate,
gs_input type zzcalculate,
gs_output type zzcalculate_response,
go_exception type ref to cx_ai_system_fault.
try.
create object go_proxy.
gs_input-number1 = '3'.
gs_input-number2 = '7'.
gs_input-operator = '*'.
go_proxy->zcalculate(
exporting input = gs_input
importing output = gs_output ).
write gs_output-result.
catch cx_ai_system_fault into go_exception.
write go_exception->errortext.
endtry.
执行结果:
![](http://e.hiphotos.baidu.com/space/pic/item/5243fbf2b21193134cf8a33365380cd790238dfe.jpg)
二、SAP系统调用EJB服务
准备好Eclipse的Java EE版、JDK1.5、Jboss5.0、Axis2。进入eclipse配置JRE和Jboss如下:
![](http://g.hiphotos.baidu.com/space/pic/item/ac4bd11373f08202dc34cdbc4bfbfbedaa641b8a.jpg)
![](http://c.hiphotos.baidu.com/space/pic/item/14ce36d3d539b600c8755334e950352ac75cb7fe.jpg)
接下来创建一个EJB3的项目:
![](http://h.hiphotos.baidu.com/space/pic/item/d01373f082025aaf23942248fbedab64024f1a8a.jpg)
![](http://a.hiphotos.baidu.com/space/pic/item/72f082025aafa40fc360925eab64034f79f0198a.jpg)
创建一个接口:
package org.clyde;
public interfaceICalculator {
Stringcalucate(String number1, String number2, String operator);
}
创建一个它的实现类:
package org.clyde;
importjavax.ejb.Remote;
importjavax.ejb.Stateless;
importjavax.jws.WebMethod;
importjavax.jws.WebService;
@Remote @Stateless@WebService
public classCalculatorImpl implements ICalculator {
@WebMethod
publicString calucate(String number1, String number2, String operator) {
Floatf1, f2, f3;
try{
f1= Float.parseFloat(number1);
f2= Float.parseFloat(number2);
switch(operator.charAt(0)) {
case'+':
f3= f1 + f2;
break;
case'-':
f3= f1 - f2;
break;
case'*':
f3= f1 * f2;
break;
case'/':
f3= f1 / f2;
break;
default:
return"Not supported!";
}
}catch (Exception e) {
return"Not supported!";
}
returnString.valueOf(f3);
}
}
![](http://d.hiphotos.baidu.com/space/pic/item/37d3d539b6003af3c90180e3352ac65c1138b6fe.jpg)
部署到Jboss上:
![](http://b.hiphotos.baidu.com/space/pic/item/83025aafa40f4bfb7276c2d7034f78f0f636188a.jpg)
WSDL的地址组合方式为:http:// + 应用服务器地址 + 端口 + 项目名 + 类名 + "?WSDL"
即:http://localhost:8080/EJB001/CalculatorImpl?WSDL
![](http://c.hiphotos.baidu.com/space/pic/item/5bafa40f4bfbfbed21ff6afc78f0f736aec31f8a.jpg)
根据此WSDL在SAP端创建代理类,配置方式跟SAP到SAP类似,只是在Lpconfig里面的URL也用当前的WSDL的URL。
![](http://d.hiphotos.baidu.com/space/pic/item/a50f4bfbfbedab6488d41143f736afc378311e8a.jpg)
![](http://e.hiphotos.baidu.com/space/pic/item/4afbfbedab64034ff46b9e85afc379310b551d8a.jpg)
![](http://f.hiphotos.baidu.com/space/pic/item/faedab64034f78f07aadc67079310a55b2191c8a.jpg)
保存激活后,返回到SE80测试:
![](http://g.hiphotos.baidu.com/space/pic/item/aa64034f78f0f736215810820a55b319eac4138a.jpg)
结果如下:
![](http://h.hiphotos.baidu.com/space/pic/item/024f78f0f736afc3f6aa63e6b319ebc4b645128a.jpg)
ABAP代码的访问同SAP到SAP,这里不再演示。
三、SAP系统到Java系统
第一步中已经发布了一个SAP系统的webservice,要用到的两个地址,
WSDl地址:http://ecc.dev.jsepc.com.cn:8002/sap/bc/srt/wsdl/bndg_4E49EDE9E05800A2E1008000C0A80106/wsdl11/allinone/ws_policy/document?sap-client=200
Endpoint地址:http://ecc.dev.jsepc.com.cn:8002/sap/bc/srt/rfc/sap/zsap_calculate/200/zsap_calculate/zsap_calculate?sap-client=200
用Axis2的WSDL2Java工具,把上面的WSDL地址转化为Java类:
![](http://a.hiphotos.baidu.com/space/pic/item/79f0f736afc379319acedaaaebc4b74542a9118a.jpg)
![](http://f.hiphotos.baidu.com/space/pic/item/b7003af33a87e950c0acafef10385343faf2b4fe.jpg)
执行完后,能看到生成的类:
![](http://g.hiphotos.baidu.com/space/pic/item/3bf33a87e950352a30da798b5343fbf2b3118bfe.jpg)
下面创建一个Java Project,写一个webservice的客户端
![](http://h.hiphotos.baidu.com/space/pic/item/3b87e950352ac65ce7be3af0fbf2b21192138afe.jpg)
把生成的SRC下面的东西复制到当前项目的SRC下面:
![](http://a.hiphotos.baidu.com/space/pic/item/e850352ac65c1038abc59241b2119313b17e89fe.jpg)
导入后,刷新,发现有错误,这是因为还没有导入Axis2的jar包,依次导入:
![](http://b.hiphotos.baidu.com/space/pic/item/f636afc379310a5522828277b74543a98326108a.jpg)
![](http://b.hiphotos.baidu.com/space/pic/item/342ac65c103853430274dba29313b07ecb8088fe.jpg)
然后写一个Client类,代码如下:
package org.clyde;
importjava.rmi.RemoteException;
importmc_style.functions.soap.sap.document.sap_com.ServiceStub;
importmc_style.functions.soap.sap.document.sap_com.ServiceStub.ZCalculate;
public class Client{
publicstatic void main(String[] args) throws RemoteException {
//代理类
ServiceStubstub = new ServiceStub(
"http://ecc.dev.jsepc.com.cn:8002/sap/bc/srt/rfc/sap"
+"/zsap_calculate/200/zsap_calculate/zsap_calculate?sap-client=200");
//准备输入
ZCalculateinput = new ZCalculate();
input.setNumber1("7");
input.setNumber2("3");
input.setOperator("-");
//调用并输出
System.out.println(stub.zCalculate(input).getResult());
}
}
给stub类的地址是上面提到的Endpoint地址,即SAP中SICF下测试服务的URL地址。
执行webservice调用,结果如下:
![](http://c.hiphotos.baidu.com/space/pic/item/c75c10385343fbf24897faa0b07eca8064388ffe.jpg)
四、EJB系统到Java系统
java中访问webservice的方法有很多种,包括Stub方式、RPC方式、CXF方式等等,
下面还是以基于Axis2引擎的Stub方式实现:
上面已经发布了一个EJB的Webservice实例,
WSDL:http://localhost:8080/EJB001/CalculatorImpl?WSDL
同上,通过WSDL2JAVA 解析为本地类,然后编写客户端,代码如下:
packageorg.clyde;
importjava.rmi.RemoteException;
importorg.clyde.CalculatorImplServiceStub.Calucate;
importorg.clyde.CalculatorImplServiceStub.CalucateE;
publicclass Client_from_EJB {
publicstatic void main(String[] args) throws RemoteException {
//代理类
CalculatorImplServiceStubstub =
newCalculatorImplServiceStub("http://localhost:8080/EJB001/CalculatorImpl?WSDL");
//准备输入
Calucateinput1 = new Calucate();
input1.setArg0("3");
input1.setArg1("8");
input1.setArg2("/");
CalucateEinput2 = new CalucateE();
input2.setCalucate(input1);
//调用并输出
System.out.println(stub.calucate(input2).getCalucateResponse().get_return());
}
}
运行结果如下:
![](http://c.hiphotos.baidu.com/space/pic/item/aec379310a55b319795fdef643a98226cefc178a.jpg)
到此,Webservice的四种交互方式都简单的做了实例分析。
相关文章推荐
- SAP和Java系统的Webservice实例
- SAP和Java系统的Webservice实例
- SAP和Java系统的Webservice实例
- SAP和Java系统的Webservice实例
- SAP和Java系统的Webservice实例 转载
- SAP和Java系统的Webservice实例
- SAP和Java系统的Webservice实例
- SAP和Java系统的Webservice实例
- SAP和Java系统的Webservice实例
- SAP和Java系统的Webservice实例
- 在与sap系统集成时遇到的问题.sap系统发布一webservice,java(xfire)作为客户端调用,调用时抛出如下异常: Wrong Content-Type and empty HTTP-Body received: ("HTTP Code 20
- java调用第三方的webservice应用实例
- WebService-Java中WebService实例
- JAVA项目中发布WebService服务——简单实例
- Java中WebService实例
- JAVA项目中发布WebService服务——简单实例
- Java系统插件开发原理与实例
- java使用axis2调用webservice接口实例
- JAVA 获取系统当前时间实例代码
- Java中WebService实例