Hi Team,
Our requirement is to consume Sales force WSDL (SOAP) with out PI involvement. We are having two WSDL's, one for Login to Salesforce and second one to exchange data.
We have created consumer service and logical port's. A proxy class with few methods is generated as expected.
The first consumer service for login is working fine. When we login, it returns the session ID which is valid for 2 hours. We tried to pass the session ID using the below code and then call the second service. It then gives error 'INVALID_SESSION_ID: Invalid Session ID found in SessionHeader: Illegal Session'.
Could you please let us know what am I missing? Is my approach correct?
Thanks in advance!
I have gone through the below links:
Web Services Security using ABAP Proxies
Consume SOAP WebService by SAP and add custom Header - Java Development - SCN Wiki
DATA: lr_login TYPE REF TO zlogin,
lr_action TYPE REF TO zexc,
ls_request TYPE zlogin_request,
ls_response TYPE zlogin_response,
ls_header TYPE REF TO if_wsprotocol_ws_header,
lr_system_fault TYPE REF TO cx_ai_system_fault,
lr_flight_not_found TYPE REF TO cx_sxidag_flight_not_found,
lv_name TYPE string,
lv_namespace TYPE string,
lr_ixml TYPE REF TO if_ixml,
lr_xml_document TYPE REF TO if_ixml_document,
lr_xml_root TYPE REF TO if_ixml_element,
lr_xml_element TYPE REF TO if_ixml_element,
lr_xml_node TYPE REF TO if_ixml_node,
lv_xstring TYPE xstring,
lv_string TYPE string,
ls_disp_req TYPE zexc_reque,
ls_disp_resp TYPE zexc_respo.
TRY.
CREATE OBJECT lr_login
EXPORTING
logical_port_name = 'ZLOGIN_PORT'.
CATCH cx_ai_system_fault INTO lr_system_fault.
ENDTRY.
ls_request-username = 'zzz.abc.com'.
ls_request-password = 'abcde123'.
TRY.
CALL METHOD lr_login->login
EXPORTING
input = ls_request
IMPORTING
output = ls_response.
CATCH cx_ai_system_fault INTO lr_system_fault.
WRITE:/ 'System Fault'(sye). WRITE:/ lr_system_fault->errortext. EXIT.
CATCH zsfcx_login_fault .
WRITE:/ 'Login Fault'. EXIT.
CATCH zsfcx_unexpected_error_fault .
WRITE:/ 'Unexpected Error'. EXIT.
CATCH zsfcx_invalid_id_fault .
WRITE:/ 'Invalid Fault'. EXIT.
CATCH cx_ai_application_fault .
WRITE:/
'Application fault'(apf).
EXIT.
ENDTRY.
IF ls_response-result-session_id IS NOT INITIAL.
TRY.
* create instance
CREATE OBJECT lr_action
EXPORTING
logical_port_name = 'ZEXC_PORT'.
* get ws_header protocol
ls_header ?= lr_action->get_protocol('IF_WSPROTOCOL_WS_HEADER').
CONCATENATE
'<Soap:Header>'
'<ns2:session xmlns:ns2="https://salesforce.com/services/Soap/c/00Dc0000003ue9S">'
'<SessionID>'ls_response-result-session_id'</SessionID>'
'</ns2:session>'
'</Soap:Header>'
INTO lv_string.
* convert to xstring
lv_xstring = cl_proxy_service=>cstring2xstring( lv_string ).
IF NOT lv_xstring IS INITIAL.
* create ixml dom document from xml xstring
CALL FUNCTION 'SDIXML_XML_TO_DOM'
EXPORTING
xml = lv_xstring
IMPORTING
document = lr_xml_document
EXCEPTIONS
invalid_input = 1
OTHERS = 2.
IF sy-subrc = 0 AND NOT lr_xml_document IS INITIAL.
lr_xml_root = lr_xml_document->get_root_element( ).
lr_xml_element ?= lr_xml_root->get_first_child( ).
* add header element by element to soap header
WHILE NOT lr_xml_element IS INITIAL.
lv_name = lr_xml_element->get_name( ).
lv_namespace = lr_xml_element->get_namespace_uri( ).
ls_header->set_request_header( name = lv_name namespace = lv_namespace dom = lr_xml_element ).
lr_xml_element ?= lr_xml_element->get_next( ).
ENDWHILE.
ENDIF.
ENDIF.
* call outbound
ls_disp_req-data-account_phone = '123-456-7890'.
ls_disp_req-data-billing_city = 'HOUSTON'.
ls_disp_req-data-billing_postal_code = '77070'.
ls_disp_req-data-billing_state = 'TX'.
ls_disp_req-data-billing_street = 'Willow Chase'.
ls_disp_req-data-check = '34567'.
ls_disp_req-data-reason_code = 'Test'.
ls_disp_req-data-salutation = 'Mr.'.
ls_disp_req-data-subject = 'Amount not received'.
TRY.
CALL METHOD lr_action->insert_apdispute_case
EXPORTING
input = ls_disp_req
IMPORTING
output = ls_disp_resp.
CATCH cx_ai_system_fault INTO lr_system_fault.
WRITE:/ 'System Fault'(sye). WRITE:/ lr_system_fault->errortext. EXIT.
CATCH cx_ai_application_fault .
WRITE:/
'Application fault'(apf).
EXIT.
ENDTRY.
CATCH cx_ai_system_fault INTO lr_system_fault.
WRITE:/ 'System Fault'(sye). WRITE:/ lr_system_fault->errortext. EXIT.
CATCH cx_ai_application_fault .
WRITE:/
'Application fault'(apf).
EXIT.
ENDTRY.
ENDIF.
Regards,
Aravind