当前位置:文档之家› ABAP外调WebService过程的介绍

ABAP外调WebService过程的介绍

第一章proxy(代理)的生成首先通过se80进入到我们要创建proxy(代理)的package(包)。

以我的zhr_password_change程序为例,该程序的目的是帮助用户修改密码,所以进入的是ZHR包。

进入ZHR包后,右键选择Create -> Enterprise Service / Web Service -> Proxy Object,弹出如下选择框:由于我们是外调Web Service,所以选择Service Consumer选项,并点击继续。

随后出现下面的选择界面:这个选择界面中,如果我们自己的机器就是服务器,那么可以选择Local File,然后给出WSDL文件所在地。

不过一般情况下,我们是通过URL/HTTP访问WSDL文件的。

这里,我得到的WSDL文件地址为:http://10.3.11.123/jfids/ChangePwService?wsdl我们需要先确认这个链接的有效性,可以在浏览器中打开这个链接,如果链接有效,则我们可以看到对应的xml 代码:将有效的URL地址输入,点击继续,如图:接下来要选择package(包)和prefix(前缀),package即proxy(代理)所在的包,prefix即代理各种属性(比如名称)、包含数据类型(比如输入数据类型、输出数据类型)等的前缀,主要用于与系统变量进行区分。

我这里选择的包是ZHR、前缀为ZCMIS_。

输入包名、前缀后选择继续,此时会出现确认信息:完成后,会看到workbench request,设置请求号和描述:然后我们会发现package(包)里出现了Enterprise Service选项,里面包含了代理类及其用到的数据类型。

我们需要保存并激活Enterprise Service选项:External View和Internal View分别展示了从被调用方和调用方看到的类的属性,我们可以看到原函数名称以及它在ABAP代码中的名称:Used Object选项会列出新生成的proxy类型以及其需要的数据类型(也就是前面指的输入数据类型、输出数据类型):我们可以通过双击proxy类型,察看这个类包含的属性和方法。

这里,我们可以看到ZCMIS_CO_CHANGE_PW_SERVICE包含了一个构造函数和一个SET_PW_DATA方法:双击任意方法,就可以看到它的代码。

这里,我双击了构造函数(CONSTRUCTOR),可看到该构造函数需要文件名和逻辑端口号,以后的内容我们将介绍逻辑端口号的配置和使用:同样,我们在Used Objects中除了察看ZCMIS_CO_CHANGE_PW_SERVICE的属性和方法之外,还可以察看其输入、输出数据的细节,以输入数据为例,双击ZCMIS_SET_PW_DATA:可以看到,ZCMIS_SET_PW_DATA是一个结构,包含了CONTROLLER、ARG0、ARG1、ARG2四个元素。

其中CONTROLLER用于控制其它元素的格式,另外三个元素则来源于外部的Web Service。

此处它们对应的是userID、oldPassword、newPassword三个数值。

CONTROLLER是PRXCTRLTAB类型,即一个由PRXCTRL类型的数据组成的表格。

PRXCTRL类型叫做输入格式控制,包含两个字段:FIELD和VALUE。

其中,FIELD对应着被控制的字段名称,VALUE通过不同值控制对应字段的输入格式(通常为1),罗列如下:1 Initial Value 初始化,比如数字为0,日期为0000-00-00等2 xsi:nil="true" xml节点元素可为空3 Hide 隐藏第二章设置逻辑端口上一章我们在察看ZCMIS_CO_CHANGE_PW_SERVICE类的CONSTRUCTOR(构造函数)的时候,看到有个参数叫做逻辑端口,逻辑端口可以用于软件之间的数据交互,也可用于连接物理端口(比如打印机)。

下面我们将配置ZCMIS_CO_CHANGE_PW_SERVICE需要的逻辑端口。

使用事务代码lpconfig可以进入管理逻辑端口的界面:输入代理类名称,逻辑端口名称(这个可以自己命名,比如我们的逻辑端口用HTTP协议、80端口连接CMIS系统,所以逻辑端口名称就为CMIS_HTTP80)。

如果该类没有缺省端口,需要选中缺省端口,这样才能在构造函数没有指明端口的情况下会将缺省端口作为逻辑端口。

选择中间的创建,进入编辑界面。

在描述一栏,我们可以给出中文的信息,比如“员工自助修改密码”。

运行时间一栏,我们需要选择Web服务基础结构。

然后在调用参数一栏,我们需要给出URL地址,即前面提到的http://10.3.11.123/jfids/ChangePwService?wsdl:保存设置,会出现customizing request,设置请求号与描述:激活设置,即完成了逻辑端口配置。

第三章调用Web Service的代码介绍这里依然将以员工自助密码修改的功能为例,我为这个功能编写的ABAP代码名为:ZHR_PASSWORD_CHANGE。

代码内容如下(需要重点关注的部分,我将以加粗字体进行介绍):*&---------------------------------------------------------------------**& Report ZHR_PASSWORD_CHANGE*&*&---------------------------------------------------------------------**& 本程序用于员工PORTAL密码修改*& 该界面获取用户输入的旧密码、新密码信息后,通过调用WebService对这些数据进行*& 处理,完成更新密码的工作*& WebService对应类型为ZLP01CO_CHANGE_PW_SERVICE:*& 输入为结构ZLP01GET_STRING,含三个字段:*& arg0:用户ID*& arg1:旧密码*& arg2:新密码*& 输出为结构ZLP01GET_STRING_RESPONSE,含一个字段:*& return:计算结果,'success'为成功,'fail'为失败*& 更多详情请参看其他注释*&---------------------------------------------------------------------**&---------------------------------------------------------------------**& 变量定义部分*&---------------------------------------------------------------------*REPORT ZHR_PASSWORD_CHANGE.DATA: ok_code TYPE sy-ucomm, "用户操作userid TYPE sy-uname. "用户IDDATA: pre_password_str(24) TYPE c, "对应0100屏幕第一行文本框new_password_str1(24) TYPE c, "对应0100屏幕第二行文本框new_password_str2(24) TYPE c. "对应0100屏幕第三行文本框DATA: webservice_proxy "WebService代理对象TYPE REF TO ZCMIS_CO_CHANGE_PW_SERVICE,"WebService代理类型webservice_input TYPE ZCMIS_SET_PW_DATA, "输入参数包,包含了三个参数 webservice_output TYPE ZCMIS_SET_PW_DATA_RESPONSE, "返回值包,包含了返回值 wa_input LIKE prxctrl. "输入格式控制DATA: webservice_sys_error TYPE REF TO cx_ai_system_fault, "系统错误webservice_app_error TYPE REF TO cx_ai_application_fault."应用错误DATA: new_password_length TYPE i, "新密码长度digit_count TYPE i. "新密码包含数字的位数我们在se80中利用外部链接http://10.3.11.123/jfids/ChangePwService?wsdl 定义好了ZCMIS_CO_CHANGE_PW_SERVICE类,这里的webservice_proxy即该类的对象。

在第一章中,我们知道这个类的SET_PW_DATA方法的输入数据类型为ZCMIS_SET_PW_DATA(含有CONTROLLER、ARG0、ARG1、ARG2四个字段)、返回数据类型为ZCMIS_SET_PW_DATA_RESPONSE(含有CONTROLLER、RETURN两个字段),所以这里需要专门定义webservice_input、webservice_output作为输入、输出的对象。

wa_input类型为prxctrl(参见第一章的内容),CONTROLLER字段就是通过一组prxctrl数据来对各个字段进行输入控制的。

*&---------------------------------------------------------------------**& 模块定义部分*& status_0100:屏幕运行前,设置工具栏、标题*& user_command_0100:屏幕运行后,根据用户命令进行操作*&---------------------------------------------------------------------*MODULE status_0100 OUTPUT.SET PF-STATUS 'STATUS_0100'. "设置工具栏SET TITLEBAR 'TITLE_0100'. "设置标题ENDMODULE.MODULE user_command_0100 INPUT.CASE sy-ucomm.WHEN 'PERFORM'. "执行PERFORM read_text.PERFORM compare_newpassword.WHEN 'EXIT'. "退出LEAVE PROGRAM.ENDCASE.ENDMODULE.*&---------------------------------------------------------------------* *& 宏定义部分*&---------------------------------------------------------------------* DEFINE popup.CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE'EXPORTINGTITEL = &1 "对话框主标题DIAGNOSETEXT1 = &2 "抬头TEXTLINE1 = &3. "正文END-OF-DEFINITION.*&---------------------------------------------------------------------* *& 函数定义部分*& read_text:读取需要的数据*& compare_newpassword:比较两次输入的新密码,不同则重新输入,相同则继续执行*& check_digit:检查新输入的密码有多少数字,用于检查密码复杂度*& execute:执行外部WebService的get_string函数*& reset:出现错误则清空输入栏以便重新输入*&---------------------------------------------------------------------*FORM read_text.userid = sy-uname. "读取登陆用户pre_password_str = pre_password_str. "读取用户输入的旧密码new_password_str1 = new_password_str1."读取用户输入的新密码new_password_str2 = new_password_str2."读取再次输入的新密码new_password_length = strlen( new_password_str1 ).digit_count = 0.ENDFORM.FORM compare_newpassword.IF new_password_str1 = new_password_str2.IF new_password_length > 5.PERFORM check_digit.IF digit_count = new_password_length ORdigit_count = 0.popup '提示' '无效操作' '新密码必须包含字母和数字,请重新输入'.ELSE."将三个参数转换为函数设定的structurewa_input-field = 'ARG0'.wa_input-value = '1'.APPEND wa_input TO webservice_input-controller.wa_input-field = 'ARG1'.wa_input-value = '1'.APPEND wa_input TO webservice_input-controller.wa_input-field = 'ARG2'.wa_input-value = '1'.APPEND wa_input TO webservice_input-controller.CLEAR wa_input.webservice_input-arg0 = userid.webservice_input-arg1 = pre_password_str.webservice_input-arg2 = new_password_str1."执行get_StringPERFORM execute.ENDIF.ELSE.popup '提示' '无效操作' '密码长度不能小于6位,请重新输入'.PERFORM reset.ENDIF.ELSE.popup '提示' '无效操作' '两次输入新密码必须相同,请重新输入'.PERFORM reset.ENDIF.ENDFORM.在第一章中我们知道输入数据除CONTROLLER外,真正输送到Web Service一端的是ARG0、ARG1、ARG2三个字段,这里,我们通过wa_input对三个字段分别进行输入控制的设置,并将设置存放进CONTROLLER字段。

相关主题