- SE80 导入WSDL文件生成ABAP代理类。
- SOAMANAGER 创建逻辑端口,指定SoapAction。
- SPROXY_START 测试Web Services 接口。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://WebXml.com.cn/">
<soapenv:Body>
<web:getMobileCodeInfo>
<web:mobileCode>1880262</web:mobileCode>
<web:userID></web:userID>
</web:getMobileCodeInfo>
</soapenv:Body>
</soapenv:Envelope>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<getMobileCodeInfoResponse xmlns="http://WebXml.com.cn/">
<getMobileCodeInfoResult>1880262:广东 惠州 广东移动全球通卡</getMobileCodeInfoResult>
</getMobileCodeInfoResponse>
</soap:Body>
</soap:Envelope>
HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Type: text/xml; charset=utf-8
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Date: Tue, 18 Jan 2022 09:50:14 GMT
REPORT zdz003 NO STANDARD PAGE HEADING.
DATA: lo_soap TYPE REF TO zco_mobile_code_wssoap.
DATA: lw_input TYPE zget_mobile_code_info_soap_in,
lw_output TYPE zget_mobile_code_info_soap_out.
DATA: lo_sys_exception TYPE REF TO cx_ai_system_fault,
lo_app_exception TYPE REF TO cx_ai_application_fault.
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-t01.
PARAMETERS: p_clas TYPE swf_clsjob-clasnam,
p_lpt TYPE srt_lp_key_fields-lp_name,
p_mob TYPE string OBLIGATORY,
p_usr TYPE string.
SELECTION-SCREEN END OF BLOCK blk1.
INITIALIZATION.
START-OF-SELECTION.
TRY.
CREATE OBJECT lo_soap
EXPORTING
logical_port_name = p_lpt.
lw_input-mobile_code = p_mob.
lw_input-user_id = p_usr.
CALL METHOD lo_soap->get_mobile_code_info
EXPORTING
input = lw_input
IMPORTING
output = lw_output.
CATCH cx_ai_system_fault INTO lo_sys_exception.
WRITE:/ lo_sys_exception->errortext.
CATCH cx_ai_application_fault INTO lo_app_exception.
WRITE:/ lo_app_exception->textid.
ENDTRY.
WRITE:/ lw_output-get_mobile_code_info_result.
事务代码 | 短文本 |
SRT_ELOG | 报表错误日志 |
SRT_LOG | SRT 错误日志 |
SRT_TEST | Web 服务测试主控室 |
SRT_UTIL | Web 服务实用程序 |
SRTERROR_E2E | WS 相关运行时错误 -E2E |
SRTLOG_E2E | SRT 错误日志 E2E |
SRTUTIL | Web 服务的跟踪实用程序 |
SRTUTIL_E2E | SRT 跟踪分析 E2E |
ABAP 代理编程模型
本文所述代理编程模型定义如何使用通过代理生成方法生成的代理。
消费者代理与提供者代理之间的区别
消费者代理与提供者代理之间存在本质区别。
消费者代理由 ABAP 对象类表示,而提供者代理则由 ABAP 对象接口和对应实施类表示。实施类创建于生成期间,之后需要添加相关应用程序代码。
实例化/调用
出站
通过实例化代理类访问消费者代理。
示例:
DATA:
my_interface TYPE REF TO zmy_co_synchronous_outbound_inter,
my_request TYPE zmy_request_message_type,
my_response TYPE zmy_response_message_type.
* 创建实例
CREATE OBJECT my_interface.
* 填写请求数据
my_request-request_message_type-simple = 'A simple String'.
* 调用代理
TRY.
CALL METHOD my_interface->execute_synchronous
EXPORTING
output = my_request
IMPORTING
input = my_response.
CATCH cx_ai_system_fault .
CATCH cx_ai_application_fault .
ENDTRY.
重要注释: 更新任务中的消费者代理
如果更新任务中留有应用程序数据,则在更新时还需要进行 XI 出站调用。 否则如果取消更新,未经计划的更新任务可能阻止队列远程函数调用队列。 由于队列之间存在链接,这可对整套出站处理产生重大影响。
入站
通过实施相关 ABAP 对象类访问服务器或入站代理。代理生成期间通过空实施创建对象类。
示例:
method ZMY_II_SYNCHRON_INBOUND_INTERF~EXECUTE_SYNCHRONOUS.
*** **** 在此插入实施 **** ***
output-response_message_type-simple = input-request_message_type-simple.
endmethod.
协议
使用 协议控制代理。
协议绑定在语义上属于同类的参数和方法。
协议示例:
•IF_WSPROTOCOL_ASYNC_MESSAGING
控制序列化上下文(队列标识),确定是否需要确认。
•IF_WSPROTOCOL_ROUTING
定义发送方/接收方。
•IF_WSPROTOCOL_SECURITY
用户/密码
协议访问取决于是消费者代理还是提供者代理。
出站
使用所生成代理类的 GET_PROTOCOL 类方法直接访问协议。
示例:
DATA:
my_interface TYPE REF TO zmy_co_asynchronous_outbound_inte,
my_request TYPE zmy_request_message_type,
async_messaging TYPE REF TO if_wsprotocol_async_messaging.
* 创建实例
CREATE OBJECT my_interface.
* 填写请求数据
my_request-request_message_type-simple = 'A simple String'.
TRY.
* 获取异步消息协议
async_messaging ?= my_interface->get_protocol( if_wsprotocol=>async_messaging ).
async_messaging->set_serialization_context( 'MY_QUEUE_ID' ).
* 出站调用
my_interface->execute_asynchronous( output = my_request ).
CATCH cx_ai_system_fault .
CATCH cx_ai_application_fault .
ENDTRY.
注意:
方法 GET_PROTOCOL 获取类型为 Type Ref To IF_WSPROTOCOL 的对象。
IF_WSPROTOCOL_ASYNC_MESSAGING 实施 IF_WSPROTOCOL,所以必须执行转型:
async_messaging ?= my_interface->get_protocol( if_wsprotocol=>async_messaging ).
接口类 IF_WSPROTOCOL 包含所有可用协议(常量形式)。
入站
在入站协议中,通过服务器上下文间接访问协议。 如果您有服务器上下文,则以访问出站代理的方式访问协议。
示例:
METHOD zmy_ii_asynchron_inbound_inter~execute_asynchronous.
*** **** 在此插入实施 **** ***
DATA:
message_guid TYPE sxmsguid,
message_id_protocol TYPE REF TO if_wsprotocol_message_id,
server_context TYPE REF TO if_ws_server_context.
TRY.
server_context = cl_proxy_access=>get_server_context( ).
message_id_protocol ?= server_context->get_protocol( if_wsprotocol=>message_id ).
message_guid = message_id_protocol->get_message_id( ).
CATCH cx_ai_system_fault .
ENDTRY.
ENDMETHOD.