簡介:
關於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類型,參數都設置為傳值:
1 FUNCTION Z_CALCULATE. 2 *"---------------------------------------------------------------------- 3 *"*"Local interface: 4 *" IMPORTING 5 *" VALUE(NUMBER1) TYPE STRING 6 *" VALUE(NUMBER2) TYPE STRING 7 *" VALUE(OPERATOR) TYPE STRING 8 *" EXPORTING 9 *" VALUE(RESULT) TYPE STRING 10 *"---------------------------------------------------------------------- 11 TRY . 12 CASE operator. 13 WHEN '+'. 14 result = number1 + number2. 15 WHEN '-'. 16 result = number1 - number2. 17 WHEN '*'. 18 result = number1 * number2. 19 WHEN '/'. 20 result = number1 / number2. 21 WHEN OTHERS. 22 result = 'Not supported!'. 23 ENDCASE. 24 CATCH cx_root. 25 result = 'Not supported!'. 26 ENDTRY. 27 CONDENSE result. 28 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 REPORT zyincl_test_00. 2 DATA: go_proxy TYPE REF TO zco_zsap_calculate, 3 gs_input TYPE zzcalculate, 4 gs_output TYPE zzcalculate_response, 5 go_exception TYPE REF TO cx_ai_system_fault. 6 TRY. 7 CREATE OBJECT go_proxy. 8 gs_input-number1 = '3'. 9 gs_input-number2 = '7'. 10 gs_input-operator = '*'. 11 go_proxy->zcalculate( 12 EXPORTING input = gs_input 13 IMPORTING output = gs_output ). 14 WRITE gs_output-result. 15 CATCH cx_ai_system_fault INTO go_exception. 16 WRITE go_exception->errortext. 17 ENDTRY.
執行結果:
二、SAP系統調用EJB服務
准備好Eclipse的Java EE版、JDK1.5、Jboss5.0、Axis2。進入eclipse配置JRE和Jboss如下:
接下來創建一個EJB3的項目:
創建一個接口:
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);
}
}
部署到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
用Axis2的WSDL2Java工具,把上面的WSDL地址轉化為Java類:
執行完后,能看到生成的類:
下面創建一個Java Project,寫一個webservice的客戶端
把生成的SRC下面的東西復制到當前項目的SRC下面:
導入后,刷新,發現有錯誤,這是因為還沒有導入Axis2的jar包,依次導入:
然后寫一個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調用,結果如下:
四、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());
}
}
運行結果如下:
到此,Webservice的四種交互方式都簡單的做了實例分析。