SAP和Java系统的Webservice实例 转载
2014-10-21 09:06
295 查看
简介
关于Webservice的概念和原理,简单来讲,Webservice是一种基于SOAP传输协议,用WSDL描述,用XML封装数据的接口技术。由于其跨平台、跨防火墙、开发成本低、开发周期短等优势而被广泛应用,但也有局限性,包括传输负载大、没有统一的实现模型等。
对于Webservice在SAP中的应用,多被用在系统同步要求高,数据传输负载小的接口开发上。下面以SAP系统和外部系统的交互为例,SAPECC系统两个、外部系统一个(JavaEJB3Jboss5),分别讲述从SAP到SAP,SAP到Java,Java到Java,Java到SAP的Webservice实例。
一、SAP系统间的Webservice调用
SE37创建函数z_calculate,类型要设置为RFC类型,参数都设置为传值:
functionz_calculate.
*"----------------------------------------------------------------------
*"*"Localinterface:
*"IMPORTING
*"VALUE(NUMBER1)TYPESTRING
*"VALUE(NUMBER2)TYPESTRING
*"VALUE(OPERATOR)TYPESTRING
*"EXPORTING
*"VALUE(RESULT)TYPESTRING
*"----------------------------------------------------------------------
try.
caseoperator.
when'+'.
result=number1+number2.
when'-'.
result=number1-number2.
when'*'.
result=number1*number2.
when'/'.
result=number1/number2.
whenothers.
result='Notsupported!'.
endcase.
catchcx_root.
result='Notsupported!'.
endtry.
condenseresult.
endfunction.
把函数发布成Webservice
其他一路下来默认,完成后服务已经创建;接下来到SOAMANAGER中去找WSDL的URL,进入到WebserviceAdministration界面,
Applyselection=>Overview=>DisplayselectedBinding'sWSDLURL,在右边可以看到了。
接下来去SICF中找到服务的Endpoint地址
在浏览器中会得到地址:
下面进入到Webservice的Client端SAP系统,SE80创建代理类:
在URL栏位输入上面的WSDL的URL
激活代理类,然后LPCONFIG创建逻辑端口:
在URL栏位输入上面的Endpoint的URL
保存后激活,然后回到SE80测试代理类:
已经成功的正确返回结果。也可以以代码的方式访问:
reportzyincl_test_00.
data:go_proxytypereftozco_zsap_calculate,
gs_inputtypezzcalculate,
gs_outputtypezzcalculate_response,
go_exceptiontypereftocx_ai_system_fault.
try.
createobjectgo_proxy.
gs_input-number1='3'.
gs_input-number2='7'.
gs_input-operator='*'.
go_proxy->zcalculate(
exportinginput=gs_input
importingoutput=gs_output).
writegs_output-result.
catchcx_ai_system_faultintogo_exception.
writego_exception->errortext.
endtry.
执行结果:
二、SAP系统调用EJB服务
准备好Eclipse的JavaEE版、JDK1.5、Jboss5.0、Axis2。进入eclipse配置JRE和Jboss如下:
接下来创建一个EJB3的项目:
创建一个接口:
packageorg.clyde;
publicinterfaceICalculator{
Stringcalucate(Stringnumber1,Stringnumber2,Stringoperator);
}
创建一个它的实现类:
packageorg.clyde;
importjavax.ejb.Remote;
importjavax.ejb.Stateless;
importjavax.jws.WebMethod;
importjavax.jws.WebService;
@Remote@Stateless@WebService
publicclassCalculatorImplimplementsICalculator{
@WebMethod
publicStringcalucate(Stringnumber1,Stringnumber2,Stringoperator){
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"Notsupported!";
}
}catch(Exceptione){
return"Notsupported!";
}
returnString.valueOf(f3);
}
}
部署到Jboss上:
WSDL的地址组合方式为:http://+应用服务器地址+端口+项目名+类名+"?WSDL"
即:http://localhost:8080/EJB001/CalculatorImpl?WSDL
根据此WSDL在SAP端创建代理类,配置方式跟SAP到SAP类似,只是在Lpconfig里面的URL也用当前的WSDL的URL。
保存激活后,返回到SE80测试:
结果如下:
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类:
执行完后,能看到生成的类:
下面创建一个JavaProject,写一个webservice的客户端
把生成的SRC下面的东西复制到当前项目的SRC下面:
导入后,刷新,发现有错误,这是因为还没有导入Axis2的jar包,依次导入:
然后写一个Client类,代码如下:
packageorg.clyde;
importjava.rmi.RemoteException;
importmc_style.functions.soap.sap.document.sap_com.ServiceStub;
importmc_style.functions.soap.sap.document.sap_com.ServiceStub.ZCalculate;
publicclassClient{
publicstaticvoidmain(String[]args)throwsRemoteException{
//代理类
ServiceStubstub=newServiceStub(
"http://ecc.dev.jsepc.com.cn:8002/sap/bc/srt/rfc/sap"
+"/zsap_calculate/200/zsap_calculate/zsap_calculate?sap-client=200");
//准备输入
ZCalculateinput=newZCalculate();
input.setNumber1("7");
input.setNumber2("3");
input.setOperator("-");
//调用并输出
System.out.println(stub.zCalculate(input).getResult());
}
}
给stub类的地址是上面提到的Endpoint地址,即SAP中SICF下测试服务的URL地址。
执行webservice调用,结果如下:
四、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;
publicclassClient_from_EJB{
publicstaticvoidmain(String[]args)throwsRemoteException{
//代理类
CalculatorImplServiceStubstub=
newCalculatorImplServiceStub("http://localhost:8080/EJB001/CalculatorImpl?WSDL");
//准备输入
Calucateinput1=newCalucate();
input1.setArg0("3");
input1.setArg1("8");
input1.setArg2("/");
CalucateEinput2=newCalucateE();
input2.setCalucate(input1);
//调用并输出
System.out.println(stub.calucate(input2).getCalucateResponse().get_return());
}
}
运行结果如下:
到此,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实例
- 利用Java编写简单的WebService实例-转载
- 在与sap系统集成时遇到的问题.sap系统发布一webservice,java(xfire)作为客户端调用,调用时抛出如下异常: Wrong Content-Type and empty HTTP-Body received: ("HTTP Code 20
- java调用第三方的webservice应用实例【转载】
- Java调用架构于C#下的WebService实例二
- Java 在基于文件系统的 JNDI 和 JNDI+LDAP 协议应用实例(转)
- Java开发WebService实例--计数器(上)
- [转载]使用Java客户端类调用c# WebService和xml rpc server
- SQL Server常用的系统存储过程应用实例(转载)
- Java开发WebService实例--计数器
- Java调用C#的WebService实例三(实际应用)