axis-c-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Golikov, Vassili" <vassili.goli...@credit-suisse.com>
Subject RE: How to get a value from SOAP header using Axis C++?
Date Mon, 09 Feb 2009 15:32:46 GMT
I tried to get data from the body but I did not succeed. I modified a
piece of code generated by Axis to have
 
 
                if(AXIS_SUCCESS == m_pCall->checkMessage("LoginReturn",
"http://www.informatica.com/wsh"))
                {
                        std::string lsessionId =
m_pCall->getElementAsString( "SessionId",
"http://www.informatica.com/wsh");
                }
 
So  m_pCall->checkMessage("LoginReturn",
"http://www.informatica.com/wsh")) works fine but the method call 
 
getElementAsString with an exception. I also tried getElementAsString(
"SessionId", 0). I did not work either.
 
Do you have any ideas?

________________________________

From: McCullough, Ryan [mailto:rmccullough@rightnow.com] 
Sent: Friday, February 06, 2009 5:46 PM
To: Apache AXIS C User List
Subject: RE: How to get a value from SOAP header using Axis C++?



After implementing that code into axis, you could get the session id
like this:

/* Example Soap 

<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

   <soapenv:Header>

      <ns1:Context soapenv:actor="" soapenv:mustUnderstand="0"
xmlns:ns1="http://www.informatica.com/wsh">

         <SessionId>1d2b79bbe22efa2011f4cf3a9db</SessionId>

      </ns1:Context>

   </soapenv:Header>

   <soapenv:Body>

      <LoginReturn
xmlns="http://www.informatica.com/wsh">1d2b79bbe22efa2011f4cf3a9db</Logi
nReturn>

   </soapenv:Body>

</soapenv:Envelope>

*/

IHeaderBlock* Header =
YourStub->getCall()->getDeSerHeaderBlock("Context",
"http://www.informatica.com/wsh");

if (Header != NULL)

{

    for (int i=1; i <= Header->getNoOfChildren(); i++)

    {

        BasicNode* t_ElementNode = Header->getChild(i);

        if (t_ElementNode != NULL &&
strcmp(t_ElementNode->getLocalName(),"SessionId") == 0)

        {

            BasicNode* t_CharacterNode = t_ElementNode->getChild(1);

            if (t_CharacterNode != NULL)

            {

                printf("Session ID: %s\n", t_CharacterNode->getValue());

            }

            break;

        }

    }

}

 

I do have a question though, it looks like the session id is in the soap
body. Why couldn't you parse it out of "LoginReturn"?

 

For creating the soap header of your request, you should look at
"Stub::createSOAPHeaderBlock()". There is decent documentation for it as
well. From the axis\include\axis\client\Stub.hpp file:

  /**

    * Create and add a SOAP header block to the Stub.

    * 

    * This will create a header block that would look like the following
when 

    * serialized:

    * \verbatim

<th:TestHeader xmlns:th="http://ws.apache.org/axisCppTest/">

</th:TestHeader>

\endverbatim

    *

    * User must use the IHeaderBlock pointer returned and fill in the
header structure.

    * e.g. To make the SOAP header look like

    * \verbatim

<SOAP-ENV:Header>

    <th:TestHeader xmlns:th="http://ws.apache.org/axisCppTest/">

        <Credentials>

            <username>Test User</username>

            <password>Test Password</password>

        </Credentials>

    </th:TestHeader>

</SOAP-ENV:Header>

\endverbatim

    * the following code segment could be used

    * <code>

    * 

    * IHeaderBlock *phb = ws.createSOAPHeaderBlock("TestHeader", 

    *
"http://ws.apache.org/axisCppTest/",

    *                                   "th");

    * 

    * 

    *  //create parent node

    * 

    *  BasicNode *parentNode = phb->createChild(ELEMENT_NODE);

    * 

    *  parentNode->setLocalName("Credentials");

    * 

    * 

    *  //create child node

    * 

    *  BasicNode *childNode = phb->createChild(ELEMENT_NODE);

    * 

    *  childNode->setLocalName("username");

    * 

    * 

    *  //create char node for value

    * 

    *  BasicNode *valueNode = phb->createChild(CHARACTER_NODE);

    * 

    *  valueNode->setValue("Test User");

    *

    *  

    *  //buld node tree

    * 

    *  childNode->addChild(valueNode);

    * 

    *  parentNode->addChild(childNode);

    * 

    *

    *  //add another node set

    * 

    *  childNode = phb->createChild(ELEMENT_NODE);

    * 

    *  childNode->setLocalName("password");

    * 

    *

    *  valueNode = phb->createChild(CHARACTER_NODE);

    * 

    *  valueNode->setValue("Test Password");

    * 

    *

    *  childNode->addChild(valueNode);

    * 

    *  parentNode->addChild(childNode);

    * 

    *

    *  phb->addChild(parentNode);

    * </code>

    *

    * @param pachLocalName Local tag name of the SOAP header. e.g.
TestHeader

    * @param pachPrefix Prefix to be used in XML represenation of SOAP
header

    *                   e.g. th

    * @param pachUri Namespace URI to be used in SOAP header.

                     e.g http://ws.apache.org/axisCppTestHeader/

    *

    * @return Pointer to the creater SOAP header block.

    */

    IHeaderBlock* AXISCALL createSOAPHeaderBlock(AxisChar *
pachLocalName,

                                                 AxisChar * pachUri, 

                                                 AxisChar * pachPrefix);

 

From: McCullough, Ryan [mailto:rmccullough@rightnow.com] 
Sent: Friday, February 06, 2009 3:27 PM
To: Apache AXIS C User List
Subject: RE: How to get a value from SOAP header using Axis C++?

 

We had a similar issue. We resolved it by modifying the source code and
compiling our own Axis binaries.

 

Add the following

axis\include\axis\client\Call.hpp:

    /**

     * Returns the DeSerialized response header.

     */

    IHeaderBlock* getDeSerHeaderBlock(const AxisChar * pName, const
AxisChar * pNamespace);

 

axis\src\engine\client\Call.cpp

IHeaderBlock* Call::getDeSerHeaderBlock(const AxisChar * pName, const
AxisChar * pNamespace)

{

    if (m_pIWSDZ != NULL) {

        return m_pIWSDZ->getHeaderBlock(pName, pNamespace, false);

    } else {

        return NULL;

    }

}

 

axis\src\soap\SoapDeSerializer.h

    IHeaderBlock* getHeaderBlock(const AxisChar* pName, const AxisChar*
pNamespace, bool bRemoveOrNot);

 

axis\src\soap\SoapDeSerializer.cpp

/*

 * Header block parsing should be done differently for different SOAP
versions.

 * Since the Header blocks may be requested in a different order than it
is in 

 * the SOAP stream there must be a mechanism to manage the situation.
Possibly 

 * to re-parse the stream part which has unused header blocks.

 */

IHeaderBlock *SoapDeSerializer::

getHeaderBlock (const AxisChar * pName, const AxisChar * pNamespace,
bool bRemoveOrNot)

{

    // if no <Header> element there can be no Header blocks 

    if (!m_pHeader)

        return NULL; 

 

    return m_pHeader->getHeaderBlock (pName, pNamespace, bRemoveOrNot);

}

 

-Ryan

 

From: Golikov, Vassili [mailto:vassili.golikov@credit-suisse.com] 
Sent: Friday, February 06, 2009 3:05 PM
To: Apache AXIS C User List
Subject: RE: How to get a value from SOAP header using Axis C++?

 

C++.

 

This is actual response from PowerCenter:

 


<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header>
      <ns1:Context soapenv:actor="" soapenv:mustUnderstand="0"
xmlns:ns1="http://www.informatica.com/wsh">
         <SessionId>1d2b79bbe22efa2011f4cf3a9db</SessionId>
      </ns1:Context>
   </soapenv:Header>
   <soapenv:Body>
      <LoginReturn
xmlns="http://www.informatica.com/wsh">1d2b79bbe22efa2011f4cf3a9db</Logi
nReturn>
   </soapenv:Body>
</soapenv:Envelope>

 

Session ID is mentioned in two places. In the header: 

 

<SessionId>1d2b79bbe22efa2011f4cf3a9db</SessionId> and in the body 

<LoginReturn
xmlns="http://www.informatica.com/wsh">1d2b79bbe22efa2011f4cf3a9db</Logi
nReturn>

Could you tell me how to get that Session Id and re-submit in another
header?

 

E.g.

 

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Header>
      <ns0:Context xmlns:ns0="http://www.informatica.com/wsh">
         <SessionId>[string]</SessionId>
      </ns0:Context>
   </soap:Header>
   <soap:Body>
      <ns0:GetWorkflowLog xmlns:ns0="http://www.informatica.com/wsh">
         <DIServiceInfo>
            <DomainName>[string]</DomainName>
            <ServiceName>[string]</ServiceName>
         </DIServiceInfo>
         <FolderName>[string]</FolderName>
         <WorkflowName>[string]</WorkflowName>
         <WorkflowRunId>[int]</WorkflowRunId>
         <WorkflowRunInstanceName>[string]</WorkflowRunInstanceName>
         <Timeout>[int]</Timeout>
      </ns0:GetWorkflowLog>
   </soap:Body>
</soap:Envelope>

 

 

Session ID should be here 

 

      <ns0:Context xmlns:ns0="http://www.informatica.com/wsh">
         <SessionId>[string]</SessionId>
      </ns0:Context>

 

 

________________________________

From: McCullough, Ryan [mailto:rmccullough@rightnow.com] 
Sent: Friday, February 06, 2009 4:59 PM
To: Apache AXIS C User List
Subject: RE: How to get a value from SOAP header using Axis C++?

Are you using Axis2/c? or Axis c++?

 

From: Golikov, Vassili [mailto:vassili.golikov@credit-suisse.com] 
Sent: Friday, February 06, 2009 2:50 PM
To: axis-c-user@ws.apache.org
Subject: How to get a value from SOAP header using Axis C++?

 

My apps server needs to talk to Informatica WS. It sends a session ID in
the header which should be retrieved and used in all their requests. How
can I get this value from a SOAP header?

Vassilli Golikov 
Equity Derivatives IT
Credit Suisse Securities (USA) LLC
One Madison Avenue
10th Floor
New York, NY 10010
212-325-8972 (Tel)
Email: vassili.golikov@credit-suisse.com 

 

========================================================================
======
Please access the attached hyperlink for an important electronic
communications disclaimer: 
 
http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html
========================================================================
======
========================================================================
======
Please access the attached hyperlink for an important electronic
communications disclaimer: 
 
http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html
========================================================================
======

==============================================================================
Please access the attached hyperlink for an important electronic communications disclaimer:


http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html
==============================================================================

Mime
View raw message