zoukankan      html  css  js  c++  java
  • 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类型,参数都设置为传值:

    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 测试代理类:


     


     

    已经成功的正确返回结果。也可以以代码的方式访问:

     

    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.

     

    执行结果:

     

    二、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的四种交互方式都简单的做了实例分析。



    http://blog.csdn.net/yin_chuan_lang/article/details/6706693

  • 相关阅读:
    vb开发最全教程
    javascript javascript面向对象的理解及简单的示例
    javascript jquery封装对象时的错误,求解!我想知道为什么
    c# sql省市联动
    javascript javascript加载类似星座、血型的函数
    c# winform使用IrisSkin2换肤弹不出窗口解决方案
    access + vb + asp 遇到一些问题的总结
    ffmpeg windows下编译ffmpeg
    wffmpeg64.dll调用 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
    非托管 调用非托管资源的使用
  • 原文地址:https://www.cnblogs.com/cnlmjer/p/4099785.html
Copyright © 2011-2022 走看看