jump to navigation

Como acceder al contenido del Payload de un ABAP PROXY síncrono septiembre 3, 2015

Posted by gstortoni in SAP PI.
Tags: , , , ,
add a comment

Mi necesidad era leer el Payload que retornaba la excepción de un WebService.

Para obtener la Excepción primero hay que generar el FaultMessage en el Repository.

Selección_089

Posteriormente se deben generar los Service interfaces correspondientes con el FaultMessage y la excepción de la respuesta:

Outbound e Inbound:

Selección_091

Luego se debe generar el Mapping entre la excepción retornada por el WebService y la estructura de nuestro FaultMessage:

Selección_090

Para finalmente incorporar todo lo realizado en el Operation Mapping correspondiente en la pestaña FAULT:

Selección_093

Asi se ve la SXI_MONITOR cuando ejecutamos una interfaz con FaultMessage:

Selección_094

Y este es el PayLoad a cual quiero acceder, ya que por no ser el Payload del RESPONSE sino que un payload de la excepción, no lo puedo sacar desde la llamada al PROXY:

Selección_095

Me interesa rescatar el TAG: faultText.

Por el lado ABAP, una vez que gatillemos la interfaz, y se produzca la Excepción, podremos capturarla de la siguiente manera:

 DATA: lo_payload_handler TYPE REF TO if_ws_payload_handler,
 lo_payload TYPE REF TO if_ws_payload,
 lt_response_data TYPE ref to IF_WS_PAYLOAD,
 lo_pointer TYPE string,

 l_node TYPE REF TO if_ixml_node,
 l_xml TYPE REF TO cl_xml_document,
 retcode TYPE sysubrc,
 id_error type string.

TRY.
 CREATE OBJECT lo_proxy.
CALL METHOD lo_proxy->os_blueexpress
 EXPORTING
 output = ls_output
 IMPORTING
 input = ls_input.
CATCH cx_ai_system_fault INTO lo_system_ex.


CATCH zcx_application_error INTO lo_fault_ex. "<<<------- Mi excepción


CATCH cx_ai_application_fault INTO lo_app_ex. 
 

ENDTRY.

IF lo_fault_ex IS NOT INITIAL.

 lo_payload_handler = cl_proxy_access=>get_payload_handler(
 proxy_name = 'ZCO_OS_XXXX' "El nombre del Proxy
 proxy_method = 'EXECUTE_SYNCHRONOUS' ).

 CREATE OBJECT l_xml.
 lo_payload = lo_payload_handler->get_payload_from_exception( exception = lo_fault_ex ).
 lo_pointer = lo_payload->get_xml_text( ).
 retcode = l_xml->parse_string( lo_pointer ).


 l_node = l_xml->find_node( name = 'faultText'). "<<<<------ TAG de mi interés
 id_error = l_node->get_value( ).

 msglong = id_error.

 message id_error type 'S'.

ENDIF.

Selección_096

Eso es todo!

Cabe destacar, que la Interface: if_ws_payload_handler no solo sirve para rescatar el Payload de una excepción, sino que para el Request y el Response.

Selección_097

Bueno, eso es todo por esta vez!

Suerte!

Anuncios