Skip to Content
Author's profile photo Gregory Niemann

Custom Headers with SOAP (XSLT / HTTP Adapter)

Hi everyone, today I want to share the solution to a small problem that was holding me back for a few hours.

We had to build a configuration for a custom Azure webservice API call.

Nothing special to be honest but the challenge was hidden within the small detail supplied by the Azure Team “you have to set a custom http header”.

Every webservice request had to have the http header attribute “Ocp-Apim-Subscription-Key” with a specific value.

To make things worse, the system in use was a PI 7.1 system with nothing else than the standard SAP adapters supplied.

The synchronous scenario looked like the following:

Sender Application -> SAP PI -> Azure API -> SAP PI -> Sender Application

We tried to make this work with the standard SOAP HTTP adapter and the SOAP HTTP AXIS adapter. But without success.

In the end, we decided to go with the standard HTTP 1.0 Adapter and do the SOAP stuff by hand.

And that’s what I want to present today, because I had some troubles to even get to this point and had to collect some stuff from various sources to make things work. So hopefully someone with the same problem can get a complete solution from this blog post.

 

Solution:

Use a standard http receiver channel and add all custom http headers in the intended fields and use an operation mapping between sender and receiver where you manually add the soap envelope via xslt mapping for the request and remove the soap envelope manually via xslt mapping for the response.

 

Set up your XSLT Mappings

Create two new textfiles and name them add_soap_envelope.xsl and remove_soap_envelope.xsl

Insert the following xslt mapping code into the add_soap_envelope.xsl and save it:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="/">
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header />
<soap:Body>
<xsl:copy-of select="."/>
</soap:Body>
</soap:Envelope>
</xsl:template>
</xsl:stylesheet>

 

Insert the following xslt mapping code into the remove_soap_envelope.xsl and save it:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<xsl:template match="/">
<xsl:apply-templates select="soapenv:Envelope/soapenv:Body/*"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

 

Put each file in a .ZIP container and import it as “Imported Archive” Object in your Enterprise Service Repository in a Software Component and namespace of your choice.

Adjusting the Operation Mapping

Due to the use of the HTTP adapter instead of the SOAP adapter we have to take care of the SOAP ENVELOPE manually in terms of adding and removing it.

In order to accomplish this both created XSLT mappings need to be placed within the relevant operation mapping.

The request message will be mapped as usual with a message mapping from source to target structure. As a second mapping step, the XSL(T) mapping is added to add the SOAP envelope to the message.

For the response message this has to happen the other way around, first remove the soap envelope and second map the response message from source to target.

You can see this “add envelope”-logic if you select the “Test” button in the operation mapping and look at the mapping steps from step “1 to 1” and “1 to 2”:

(From Step 1 to 1)

(From Step 1 to 2)

Configure the HTTP Receiver Communication Channel

For the communication details we used a sm59 destination (customer request) but you can also use a “Addressing Type = URL Address”

 

This configuration enables you to add custom header attributes to a SOAP webservice scenario.

I hope there is at least one of you out there who finds this helpful.

Wish you the best guys!

 

Sources for the xslt-mapping and the hint with the http adapter:

https://archive.sap.com/discussions/thread/3891408

https://archive.sap.com/discussions/thread/3809757

Assigned Tags

      4 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo Amita B
      Amita B

      Hello Gregory,

      I have a similar kind of requirement to develop XSLT mapping in order to get the desired output. Could you please help me on this? Below is the thread I created:

      https://answers.sap.com/questions/303535/soap-envelopeheader-and-body-addition-using-xslt-m.html?childToView=302590#

       

      My input XML to XSLT is like this:

      <BillingRequest>

      <declarantTin>200000328-1</declarantTin> /* this declarantTin is a field inside Billing Request */

      </BillingRequest>

      I want the output like below (also attached expected output)

      Regards,

      Amita

      Author's profile photo Parth Vaishnav
      Parth Vaishnav

      Hi Gregory Niemann

      Thanks for your blog. It was a saviour for me as I had tried all varied option from SOAP Axis Protocol to SOAP With Beans but no luck.
      Finally I followed the same procedure as mention with http receiver and XSLT mapping and I’m through with the integration.
      Just one qury how to handle the Fault as error will come in SOAP Envelop..
      Regards,
      Rajan
      Author's profile photo Arthur Parisius
      Arthur Parisius

      Hi All,

      As someone who has to setup something similar to this for the first time, could anyone provide me with a link or something with a step by step description on how to do this complete setup?

      Thanks in advance,

      Arthur

       

      Author's profile photo Arthur Parisius
      Arthur Parisius

      Just to be a bit more complete I found this link https://blogs.sap.com/2013/07/29/consuming-webservices-directly-from-abap/, but as you might suspect this didn't create the SOAP envelope parts. This blog looks like the solution but I can't determine where exactly the different steps need to be performed.

      So I any of you could point me to a more step by step instruction I would greatly appreciate it.

      Arthur