简介:

关于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 = ''.
gs_input-number2 = ''.
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的四种交互方式都简单的做了实例分析。

SAP和Java系统的Webservice实例的更多相关文章

  1. Java 使用Axis实现WebService实例

    在上一篇WebService实例中,基于jdk1.6以上的javax.jws 发布webservice接口.这篇博文则主要用eclipse/myeclipse 使用axis插件进行发布和调用WebSe ...

  2. 利用Java编写简单的WebService实例

    使用Axis编写WebService比較简单,就我的理解,WebService的实现代码和编写Java代码事实上没有什么差别,主要是将哪些Java类公布为WebService. 以下是一个从编写測试样 ...

  3. 利用Java编写简单的WebService实例-转载

    使用Axis编写WebService比较简单,就我的理解,WebService的实现代码和编写Java代码其实没有什么区别,主要是将哪些Java类发布为WebService.下面是一个从编写测试例子到 ...

  4. XFire创建WebService实例应用

    [转自] http://clq9761.iteye.com/blog/1261963 XFire创建WebService实例应用 XFire使得在JavaEE应用中发布Web服务变得轻而易举.和其他W ...

  5. 20170326 ABAP调用外部webservice实例

    调用外部webservice 使用Tcode: SICF SPROXSET      设置创建proxy 的权限 SE80 SOAMANAGER 一.目的:调用外部SRM系统的 webservice: ...

  6. java如何实现webservice中wsdlLocation访问地址的可配置化

    背景:项目中调用了别的系统的webservice接口,调用成功之后发现wsdlLocation的地址是写死的,不方便修改,所以需要实现地址,包括用户名密码的可配置.项目的框架是Spring,调用web ...

  7. Java调用.Net WebService参数为空解决办法 (远程)调试webservice方法 转

    Java调用.Net WebService参数为空解决办法 (远程)调试webservice方法   同事遇到一个很囧的问题,java调,netwebservice的时候,调用无参数方法成功,调用有参 ...

  8. Java动态调用webService,axis2动态调用webService

    Java动态调用webService axis2动态调用webService >>>>>>>>>>>>>>>& ...

  9. delphi调用java编写的webservice

    delphi调用java编写的webservice JAVApojo: public class GroupInfo implements Serializable{    private stati ...

随机推荐

  1. 读书笔记_Effective_C++_条款四十四:将与参数无关的代码抽离template

    标题上说“将与参数无关的代码抽离template”,这里的参数既可以指类型,也可以是非类型,我们先来看看非类型的情况. 假定我们要为矩阵写一个类,这个矩阵的行列元素个数相等,是一个方阵,因而我们可以对 ...

  2. mingW与cygwin

    转自:http://hi.baidu.com/ooxxer/item/d25dccc072846a50ac00ef7e# 首先MingW和cygwin都可以用来跨平台开发.  MinGW是Minima ...

  3. Js调用Java方法并互相传参

    Js通过PhoneGap调用Java方法并互相传参的. 一.JAVA代码 写一个类,该类继承自Plugin并重写execute方法. import org.json.JSONArray; import ...

  4. Android之Handler源码深入分析

    闲着没事,就来看看源码,看看源码的各种原理,会用只是简单的,知道为什么才是最牛逼的. Handler源码分析那,从使用的步骤来边用边分析: 1.创建一个Handler对象:new Handler(ge ...

  5. [New Portal]Windows Azure Virtual Machine (10) 自定义Windows Azure Virtual Machine模板

    <Windows Azure Platform 系列文章目录> 通过之前的文章,我相信大家对微软Windows Azure Virtual Machine有一定的了解了. 虽然微软提供了非 ...

  6. nodePPT初认识启动与手机控制

    最近要做个PPT,想起之前看到过个网页PPT,于是这次就想尝试下,搜了下弹出个nodeppt---有可能是最好的网页PPT,那,就这个吧. 按照文档来,貌似有点问题,百度,又是一堆粘贴复制,没点用.自 ...

  7. C#设计模式——模板方法(Template Method)

    一.概述在软件开发中,对某一项操作往往有固定的算法结构,而具体的子步骤会因为不同的需要而有所不同.如何可以在稳定算法结构的同时来灵活应对子步骤变化的需求呢?二.模板方法模板方法是一种常见的设计模式,它 ...

  8. [迷宫中的算法实践]迷宫生成算法——递归分割算法

    Recursive division method        Mazes can be created with recursive division, an algorithm which wo ...

  9. 调试报“The source file is different from when the module was built.”问题的解决

    It is related to the checksums which is used to ensure that you are stepping in matching source. You ...

  10. C# Form实现自定义光标

    WinForm代码如下: using System; using System.Reflection; using System.Runtime.InteropServices; using Syst ...