1, webservice简介
关于Webservice的概念和原理,简单来讲,Webservice是一种基于SOAP传输协议,用WSDL描述,用XML封装数据的接口技术。由于其跨平台、跨防火墙、开发成本低、开发周期短等优势而被广泛应用,但也有局限性,包括传输负载大、没有统一的实现模型等。
对于Webservice在SAP系统中的应用,多被用在系统同步要求高,数据传输负载小的接口开发上。下面以SAP系统和外部系统的交互为例,SAP ECC系统两个、外部系统一个(Java EJB3 Jboss5),分别讲述从SAP到SAP,SAP到Java,Java到Java,Java到SAP的Webservice实例。
2, SAP系统间的Webservice调用
SE37创建函数z_calculate,类型要设置为RFC类型,参数都设置为传值:
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
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
其他一路下来默认,完成后服务已经创建;接下来到SOAMANAGER中去找WSDL的URL,进入到Web service Administration界面,
Apply selection => Overview => Displayselected Binding's WSDL URL,在右边可以看到了。
接下来去SICF中找到服务的Endpoint地址
在浏览器中会得到地址:
下面进入到Webservice的Client端SAP系统,SE80创建代理类:
在URL栏位输入上面的WSDL的URL
激活代理类,然后LPCONFIG创建逻辑端口:
在URL栏位输入上面的Endpoint的URL
保存后激活,然后回到SE80 测试代理类:
已经成功的正确返回结果。也可以以代码的方式访问:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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. |
执行结果:
3, SAP系统调用EJB服务
准备好Eclipse的Java EE版、JDK1.5、Jboss5.0、Axis2。进入eclipse配置JRE和Jboss如下:
接下来创建一个EJB3的项目:
创建一个接口:
1 2 3 4 5 6 7 |
package org.clyde; public interfaceICalculator { Stringcalucate(String number1, String number2, String operator); } |
创建一个它的实现类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
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); } } |
部署到Jboss上:
WSDL的地址组合方式为:http:// + 应用服务器地址 + 端口 + 项目名 + 类名 + "?WSDL"
即:http://localhost:8080/EJB001/CalculatorImpl?WSDL
根据此WSDL在SAP端创建代理类,配置方式跟SAP到SAP类似,只是在Lpconfig里面的URL也用当前的WSDL的URL。
保存激活后,返回到SE80测试:
结果如下:
ABAP代码的访问同SAP到SAP,这里不再演示。
4, 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类:
执行完后,能看到生成的类:
下面创建一个Java Project,写一个webservice的客户端
把生成的SRC下面的东西复制到当前项目的SRC下面:
导入后,刷新,发现有错误,这是因为还没有导入Axis2的jar包,依次导入:
然后写一个Client类,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
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调用,结果如下:
5, EJB系统到Java系统
java中访问webservice的方法有很多种,包括Stub方式、RPC方式、CXF方式等等,
下面还是以基于Axis2引擎的Stub方式实现:
上面已经发布了一个EJB的Webservice实例,
WSDL:http://localhost:8080/EJB001/CalculatorImpl?WSDL
同上,通过WSDL2JAVA 解析为本地类,然后编写客户端,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
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()); } } |
运行结果如下:
以上。
厉害了
2017-09-05 7:56 上午