您的位置:首页 > 编程语言 > Java开发

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的四种交互方式都简单的做了实例分析。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: