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 = ''.
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
用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实例的更多相关文章
- Java 使用Axis实现WebService实例
在上一篇WebService实例中,基于jdk1.6以上的javax.jws 发布webservice接口.这篇博文则主要用eclipse/myeclipse 使用axis插件进行发布和调用WebSe ...
- 利用Java编写简单的WebService实例
使用Axis编写WebService比較简单,就我的理解,WebService的实现代码和编写Java代码事实上没有什么差别,主要是将哪些Java类公布为WebService. 以下是一个从编写測试样 ...
- 利用Java编写简单的WebService实例-转载
使用Axis编写WebService比较简单,就我的理解,WebService的实现代码和编写Java代码其实没有什么区别,主要是将哪些Java类发布为WebService.下面是一个从编写测试例子到 ...
- XFire创建WebService实例应用
[转自] http://clq9761.iteye.com/blog/1261963 XFire创建WebService实例应用 XFire使得在JavaEE应用中发布Web服务变得轻而易举.和其他W ...
- 20170326 ABAP调用外部webservice实例
调用外部webservice 使用Tcode: SICF SPROXSET 设置创建proxy 的权限 SE80 SOAMANAGER 一.目的:调用外部SRM系统的 webservice: ...
- java如何实现webservice中wsdlLocation访问地址的可配置化
背景:项目中调用了别的系统的webservice接口,调用成功之后发现wsdlLocation的地址是写死的,不方便修改,所以需要实现地址,包括用户名密码的可配置.项目的框架是Spring,调用web ...
- Java调用.Net WebService参数为空解决办法 (远程)调试webservice方法 转
Java调用.Net WebService参数为空解决办法 (远程)调试webservice方法 同事遇到一个很囧的问题,java调,netwebservice的时候,调用无参数方法成功,调用有参 ...
- Java动态调用webService,axis2动态调用webService
Java动态调用webService axis2动态调用webService >>>>>>>>>>>>>>>& ...
- delphi调用java编写的webservice
delphi调用java编写的webservice JAVApojo: public class GroupInfo implements Serializable{ private stati ...
随机推荐
- JAVA字节码解析
Java字节码指令 Java 字节码指令及javap 使用说明 ### java字节码指令列表 字节码 助记符 指令含义 0x00 nop 什么都不做 0x01 aconst_null 将null推送 ...
- DevExpress XtraTreeList的复选框 禁用
树的2个事件代码如下,通过节点的tag判断是否禁用节点前的复选框.树的节点加载时设置要禁用的节点tag为-1,不禁用的则设为相关的值 private void treeListPer_CustomDr ...
- Git 文件比较
Git 的三个作业场: 工作区(Work Tree) 项目根目录下 .git 目录以外所有区域,是编辑项目文件的地方. 缓存区(Index) 工作区文件必须先保存在缓存区,之后从缓存区保存到仓库. 仓 ...
- 背影渐变shape写法
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http:/ ...
- 轻应用、Web app 、Native app三者区别关系是什么?
[龙友导读]最近百度公司在大会上宣布推出“轻应用”.轻应用到底是什么呢,和我们说的web app.native app到底有什么区别?是新生物的诞生还是概念的炒作?所以,今天特意为大家整理分享一篇这方 ...
- swift实现冒泡排序
刚刚坐着没事干,就用swift语言写了写冒泡排序,还望高手指点.拍砖!哈哈! 废话不多说,上代码! import Cocoa var array = [,,,,,,,,,,,,,,,,,] print ...
- 字符编码(ASCII,Unicode和UTF-8) 和 大小端
本文包括2部分内容:“ASCII,Unicode和UTF-8” 和 “Big Endian和Little Endian”. 第1部分 ASCII,Unicode和UTF-8 介绍 1. ASCII码 ...
- MySQL中的账号与权限管理
MySQL权限管理 权限系统的工作原理 MySQL权限系统通过下面两个阶段进行认证: (1)对连接的用户进行身份认证,合法的用户通过认证.不合法的用户拒绝连接. (2)对通过认 ...
- 《构建之法》第8、9、10章的读后感和第一个sprint总结
第八章——主要介绍软件需求. 主要步骤:1.获取和引导需求.2.分析和定义需求.3.验证需求.4.在软件产品的生命周期中管理需求. 对软件需求的划分:1.对产品功能性的需求.2.对产品开发过程的需求. ...
- C#-Windows服務以LocalSystem賬戶安裝的話無法獲取我的文檔路徑
如圖,如果Window服務以上圖 Account安裝運行,則無法獲取到 以下路徑: System.Environment.GetFolderPath(Environment.SpecialFolder ...