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類型,參數都設置為傳值:

 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

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類,代碼如下:

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的四種交互方式都簡單的做了實例分析。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM