Como acceder al contenido del Payload de un ABAP PROXY síncrono septiembre 3, 2015
Posted by gstortoni in SAP PI.Tags: ABAP PROXY, Exception, Fault, FaultMessage, Payload
trackback
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.
Posteriormente se deben generar los Service interfaces correspondientes con el FaultMessage y la excepción de la respuesta:
Outbound e Inbound:
Luego se debe generar el Mapping entre la excepción retornada por el WebService y la estructura de nuestro FaultMessage:
Para finalmente incorporar todo lo realizado en el Operation Mapping correspondiente en la pestaña FAULT:
Asi se ve la SXI_MONITOR cuando ejecutamos una interfaz con FaultMessage:
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:
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.
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.
Bueno, eso es todo por esta vez!
Suerte!
Comentarios»
No comments yet — be the first.