Handle SOAP with Attachment in SAP PI 7.31
I came across with lots of questions related with SOAP with attachments in PI and can’t see many guides/blogs related to this. So I thought to clear the cloud on this with a Synchronous SOAP-PI-Proxy scenario.
In this scenario we will handle attachment in Synchronous proxy call. SOAP request will pushed through third party tool SOAPUI, where we will attach the payload in request.
- SLD configuration is with Technical System and Business System is done. Product and SWC is created in SLD.
- SWC is imported in ESR.
- Communication between ECC to PI and PI to Proxy is done.
- ABAP code will only include logic of How to read incoming attachment.
- SOAPUI is installed.
Below is the development done in PI side –
For testing purpose, I am taking few fields in source and target side. Main aim is to read attachment in inbound proxy.
Source Data Type – DT_Source
Target Data Type – DT_TARGET
Based on these data types, create Message type – MT_SOURCE and MT_TARGET.
Create Service Interface for Synchronous message flow.
Outbound Service Interface –
Inbound Service Interface-
Next step is to create Request and Response Message Mappings.
Request Message Mapping –
Response Message Mapping –
Now create operations mapping based on above request and response mapping.
Request Operation Mapping –
Response Operation Mapping –
Configuration – Integration Builder
For configuration of this scenario, we need to create 2 Communication channel (Sender and Receiver) and an ICO.
Sender Communication Channel – SOAP Sender for Proxy communication, which is able to hold attachment if we click on Keep Attachments under Conversion Parameters.
Receiver Communication Channel
Create Integrated Configuration between sender and receiver with above communication channel with operations mapping.
Now, development is completed from PI side. We need to go to ECC and generated server proxy to implement the method to read attachment and send output file back.
In ECC, go to SPROXY transaction and generate proxy for Inbound Service Interface.
Double Click on provider class->Method Name to implement logic in inbound proxy class method.
ABAP Code –
METHOD zii_si_target~si_target. *** **** INSERT IMPLEMENTATION HERE **** *** DATA: lt_attach TYPE prx_attach, l_name TYPE string, l_xstring TYPE xstring, l_string TYPE string, l_type TYPE string, l_attachment TYPE REF TO if_ai_attachment. DATA: lo_server_context TYPE REF TO if_ws_server_context, lo_payload_protocol TYPE REF TO if_wsprotocol. DATA : l_kind TYPE sychar01. TRY. lo_server_context = cl_proxy_access=>get_server_context( ). lo_payload_protocol = lo_server_context->get_protocol( if_wsprotocol=>payload ). DATA : lo_attachment_protocol TYPE REF TO if_wsprotocol_attachments. lo_attachment_protocol ?= lo_server_context->get_protocol( if_wsprotocol=>attachments ). CALL METHOD lo_attachment_protocol->get_attachments RECEIVING attachments = lt_attach. . CATCH cx_ai_system_fault. ENDTRY. LOOP AT lt_attach INTO l_attachment. CALL METHOD l_attachment->get_kind RECEIVING p_kind = l_kind. IF l_kind NE space. CALL METHOD l_attachment->get_binary_data RECEIVING p_data = l_xstring. ENDIF. ENDLOOP. CALL FUNCTION 'LXE_COMMON_XSTRING_TO_STRING' EXPORTING in_xstring = l_xstring * IN_CODEPAGE = '4110' * EX_CODEPAGE = '0000' * UNMASK_CRLF = '' IMPORTING ex_string = l_string EXCEPTIONS error = 1 OTHERS = 2. IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. DATA : lt_record TYPE zdt_target_record_tab, lwa_record TYPE zdt_target_record. CLEAR lwa_record. lwa_record-id = l_string. APPEND lwa_record TO lt_record. output-mt_target-record = lt_record. ENDMETHOD.
Above code help to read incoming attachment in inbound proxy method in ABAP and then we can implement it as per our requirement. As of now, I have mapped incoming payload to one of the field (ID of data types mentioned earlier).
We are ready to test this scenario.
First step of testing is to download WSDL of this scenario.
Open Integrated Configuration ->Display WSDL -> Save to save the WSDL.
Open SOAPUI and give SOAP UI project name and browse WSDL path, downloaded in earlier step. Then double click on request 1 to send SOAP request to SAP. Add attachment to the message before sending any request. Also add authentication details in SOAPUI before posting request.
Below is the response received in SOAPUI.
Through this blog, I tried to give a simple solution about How to read an attachment in inbound proxy. There is possibility of different solution approach and above blog is in one of them. Hope this will help many people who stuck in SOAP with attachment scenario.