因为工作的原因,需要从SAP ERP软件中调用外围系统提供的WEBSERVICE服务(后面简称WEB服务).整理了一下ABAP调用WEB服务的步骤.希望对你能有所帮助

为什么不通过PO调用
个人觉得,异步接口可以通过PO.同步接口还是直接在ECC调用会好一些.避免一些无用的环节影响同步接口的响应.
ABAP调用WEB服务的前提条件:
你需要一个WEB服务的WSDL定义的地址链接. 后面的演示用了之前用RFC函数发布的WEB服务的WSDL定义.
实上在SAP中调用WEBService的方法很多:
1.我们可以直接把WEB服务当成一个REST,直接在代码中所这当成了个HTTP地址,直接POST报文,使用类lo_http_client,直接操作,并返回报文,再直接JSON,XML到SAP结构的转换就成,这种方法网上很多,比如这里。
2.需求数据简单,还可以直接使用HTTP_POST,HTTP_GET,直接操作就行。
3.使用SAP标准的调用方法,配置相对应的SOPMANAGE,这好像是最标准的方式,这种方法,结构化,对象化更强,可操作性也强,但配置太麻烦了,所以总感觉得此方不好,项目中前两法都用,但此方法,好像只是在学习时使用过,在项目中以直没使用,此文主要记录的是就是此方法,细节请参看下面。
4.前久在做银企业直接的项目,项目中使用的是以EPIC为基础的一个框架做的银企直联。使用此框架后,在新增加一个银行功能(其实也就相当于是增加一个新POST的WEB服务接口)时,只要按银行给的接口文档,做一些配置,然后做增加一些少量的代码就能实现银企直联,并且有完整的日志记录等。在这其中我觉得这也是一个通用接口的好方法,所以等时间方便时,要把此框架整理一下,做成一个通用的接口方案。
下图是百度百科关于WSDL的解释. 有兴趣的自行百度一下

1.创建企业服务
进入TCODE: SE80. 选择一个开发类,右键点击开发类,创建一个企业服务,进入创建向导

2.创建消费者代理
进入向导后,选择 service consumer(消费者代理).

3.选择external WSDL

选择URL 创建 你也可以用浏览器打开wsdl 下载为本地文件后, 选择local File创建

选择URL 创建 你也可以用浏览器打开wsdl 下载为本地文件后, 选择local File创建

输入之前准备好的WSDL的url地址

因为演示的服务是SAP提供的WEB服务 . 所以系统会弹框输入SAP的登录信息, 如果是其它系统提供的, 可能就没有这弹框了.

设置一个前缀 和开发类.

4.发布消费者代理
完成后. 系统会生成一个service consumer Z_IF_SD216,( 这个服务的名称来自WSDL中的定义) 及对应的类. ZTS_CO_Z_IF_SD216.

修改 release status 为发布状态. 激活一下.

5.尝试测试一下
尝试测试对象. 系统会报错.原因是消费者代理尚未在当前服务器部署. (消费者代理传输到其它系统后,同样需要部署一下,类似于服务的发布需要在不同的服务器上部署)

6.部署服务
执行TCODE : SOAMANAGER . 进入浏览器界面. 找到之前创建好的消费者代理.

点击消费者代理.
服务定义是SAP发布的WEB服务.
消费者代理是调用其它系统的WEB服务.
基于WSDL完成配置. 进入配置向导.

输入一个逻辑端口名称. 后面测试及程序中会用到这个端口.

输入一下wsdl 地址. 可能需要输入用户 /密码(依赖于WEB服务)

查看一下

因为之前创建的服务使用了基本验证. 所以这里需要输入基本验证的用户/密码(依赖于WEB服务的定义)

选择一下登录语言(估计SAP发布的WEBSERVICE才会有这个选项)




点击完成后, 系统会创建并激活一个逻辑端口.
7.测试
回到SE80找到之前创建的企业服务 service consumers ZTS_CO_Z_IF_SD216

重新测试时.输入创建的逻辑端口 ZTS_PORT.点击执行

点击按钮 进入数据编辑模式

修改并保存测试数据

执行后可以看到返回的信息

8.
程序调用
双击类 查看生成的类的输入,输出参数, 写代码时会用到这些参数的定义.

代码调用DEMO程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
*&---------------------------------------------------------------------* *& Report ZTS_CALL_WEBSERVICE *&---------------------------------------------------------------------* *& DEMO程序,调用WEBSERVICE *&---------------------------------------------------------------------* REPORT zts_call_webservice. TABLES: kna1. PARAMETERS: p_kunnr LIKE kna1-kunnr DEFAULT '1000098', p_vkorg LIKE knvv-vkorg default '6121'. START-OF-SELECTION. PERFORM frm_call. *&---------------------------------------------------------------------* *& Form FRM_CALL *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_call . DATA:lc_web TYPE REF TO zts_co_z_if_sd216. "WebService代理类 DATA:ls_input TYPE zts_z_if_sd216, "输入参数 ls_output TYPE zts_z_if_sd216response. "输出参数 DATA:lo_sys_exception TYPE REF TO cx_ai_system_fault, lo_app_exception TYPE REF TO cx_ai_application_fault. TRY. CREATE OBJECT lc_web EXPORTING logical_port_name = 'ZTS_PORT'. "为此WebService创建的逻辑端口。 CATCH cx_ai_system_fault . MESSAGE '出错了' TYPE 'E'. ENDTRY. *传递传入参数 ls_input-is_stru-kunnr = p_kunnr. ls_input-is_stru-vkorg = p_vkorg. TRY. CALL METHOD lc_web->z_if_sd216 EXPORTING input = ls_input IMPORTING output = ls_output. CATCH cx_ai_system_fault INTO lo_sys_exception . "message ‘出错了 systemai’ type ‘S’. WRITE lo_sys_exception->errortext. CATCH cx_ai_application_fault INTO lo_app_exception . WRITE / . WRITE lo_app_exception->textid. ENDTRY. WRITE: ls_output-es_stru-kwert. ENDFORM. |
你好,请问有遇到过创建企业服务时报错
没有,
请问在输入wsdl的url的时候,报错:错误的值:实体 “<>”(58 /2834 )。end tag ‘span’ does not match begin tag ‘br’
这意思,应该是说,你的WSDL内容中,在span,br间有问题吧。你可以试试在这之间,是不是有 / br,或者是没有 /span,之类的,这两个标识符,应该是可以删除了的,应该不影响结果。如对方不能修改的话,直接下载WSDL,并修改,然后在SAP里引入这人文件就行。
您好,我做了个服务消费者,用SE80进入企业服务器后用新生成的类文件,在数据编辑模式中输入数据显示正常;可是我做的DEMO在显示时,返回的数据一直为空;请问我的问题在哪里
这问题太泛了,没办法回答。