* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Clase genérica para WS
CLASS Cl_MY_WS DEFINITION.
PUBLIC SECTION.
CONSTANTS: ws_error_system_fault TYPE i VALUE '99'.
*--[ Esto se cambiará dependiendo del servicio
DATA: ws_obj TYPE REF TO zavlco_si_avl_cp_piae_verifica, " #CHANGE Ver constructor
ws_output TYPE zavlmt_avl_piae_obtener_reque1, " #CHANGE Parámetros del WS
ws_input TYPE zavlmt_avl_piae_obtener_respo1, " #CHANGE Parámetros del WS
ws_msgid TYPE string,
ws_error_text TYPE string,
ws_error_text_long TYPE string,
ws_xml_request TYPE string,
ws_xml_response TYPE string,
ws_xml_exception TYPE string,
ws_error TYPE sysubrc,
ws_extra_data type xfeld.
METHODS: ws_data_load,
ws_main,
ws_call RETURNING VALUE(p_ret) TYPE i,
ws_return_OK,
ws_return_KO,
constructor.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS cl_my_ws IMPLEMENTATION.
METHOD constructor.
*--[ Pos si se quiere meter en un método y reutilizar
CLEAR: ws_error, ws_output, ws_input, ws_msgid, ws_error_text,
ws_error_text_long, ws_xml_request, ws_xml_response,
ws_xml_exception, ws_extra_data.
ws_obj = NEW zavlco_si_avl_cp_piae_verifica( ). "<-- Se crea el objeto
ENDMETHOD.
METHOD ws_main.
ws_data_load( ).
IF ws_Call( ) IS INITIAL.
ws_return_ok( ).
ELSE.
ws_return_KO( ).
ENDIF.
ENDMETHOD.
METHOD ws_data_load.
ENDMETHOD.
METHOD ws_call.
DATA: lr_proxy_basis TYPE REF TO if_proxy_basis,
lr_prot_payload TYPE REF TO if_wsprotocol_payload,
lo_protocol TYPE REF TO if_wsprotocol_message_id,
lo_server_context TYPE REF TO if_ws_server_context.
DATA: lv_msgid TYPE sxmsmguid.
DATA: lv_msgid_string TYPE string.
DATA: payload_OBJ TYPE REF TO if_ws_payload.
lr_proxy_basis ?= ws_obj.
lr_prot_payload ?= lr_proxy_basis->get_protocol( if_wsprotocol=>payload ).
lr_prot_payload->announce_payload_consumption( ).
lr_prot_payload->set_extended_xml_handling( extended_xml_handling = abap_true ).
CLEAR p_ret.
DATA: l_catch_sf TYPE REF TO cx_ai_system_fault.
TRY.
CALL METHOD ws_obj->o_obtener_sync " #CHANGE <-- Método al que llamaremos
EXPORTING
output = ws_output "<-- Parámetros de salida
IMPORTING
input = ws_input. "<-- Parámetros de entrada
CATCH cx_ai_system_fault INTO l_catch_sf.
ws_error_text = l_catch_sf->get_text( ).
ws_error_text_long = l_catch_sf->get_longtext( ).
ws_error = p_ret = ws_error_system_fault.
ENDTRY.
check not ws_extra_data is INITIAL. "<-- Para debuging
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Descargamos los XML de comunicación por si queremos tratarlos
TRY.
payload_OBJ ?= lr_prot_payload->get_sent_request_payload( ).
ws_xml_request = payload_OBJ->get_xml_text( ).
CATCH cx_ai_system_fault.
ENDTRY.
TRY.
payload_OBJ ?= lr_prot_payload->get_sent_exception_payload( ).
ws_xml_exception = payload_OBJ->get_xml_text( ).
CATCH cx_ai_system_fault.
ENDTRY.
TRY.
payload_OBJ ?= lr_prot_payload->get_sent_response_payload( ).
ws_xml_response = payload_OBJ->get_xml_text( ).
CATCH cx_ai_system_fault.
ENDTRY.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Obtenemos el MSGID de la llamada
TRY.
lo_protocol ?= lr_proxy_basis->get_protocol( if_wsprotocol=>message_id ).
DATA(msgid) = lo_protocol->get_message_id( ).
ws_msgid = msgid.
CATCH cx_ai_system_fault.
ENDTRY.
ENDMETHOD.
METHOD ws_return_OK.
ENDMETHOD.
METHOD ws_return_KO.
ENDMETHOD.
ENDCLASS.
end-of-SELECTION.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Ejemplo de USO
DATA: my_ws TYPE REF TO Cl_MY_WS.
my_ws = NEW Cl_MY_WS( ).
my_ws->ws_main( ).