Set custom SOAP header using Axis 1.4

44,297

Solution 1

Maybe you can use org.apache.axis.client.Stub.setHeader method? Something like this:

MyServiceLocator wsLocator = new MyServiceLocator();
MyServiceSoap ws = wsLocator.getMyServiceSoap(new URL("http://localhost/MyService.asmx"));

//add SOAP header for authentication
SOAPHeaderElement authentication = new SOAPHeaderElement("http://mc1.com.br/","Authentication");
SOAPHeaderElement user = new SOAPHeaderElement("http://mc1.com.br/","User", "string");
SOAPHeaderElement password = new SOAPHeaderElement("http://mc1.com.br/","Password", "string");
authentication.addChild(user);
authentication.addChild(password);
((Stub)ws).setHeader(authentication);

//now you can use ws to invoke web services...

Solution 2

If you have an object representing the Authentication container with userid and password, you can do it like so:

import org.apache.axis.client.Stub;

//...

MyAuthObj authObj = new MyAuthObj("userid","password");
((Stub) yourServiceObject).setHeader("urn://your/name/space/here", "partName", authObj);

Solution 3

I used almost the same solution as mentioned before:

SOAPHeaderElement cigWsHeader = new SOAPHeaderElement("https://ws.creditinfo.com", "CigWsHeader");
cigWsHeader.addChildElement("UserName").setValue("username");
cigWsHeader.addChildElement("Password").setValue("password");

var port = new ServiceLocator().getServiceSoap(someUrl);
((Stub) port).setHeader(cigWsHeader);

And spent hours searching why "Security header not found". And the aswer is... redundant symbol "/" at the namespace: "https://ws.creditinfo.com/" . Seriously! Keep it in mind.

Solution 4

I have the same issue and solved by the below fragement:

ServiceSoapStub clientStub = (ServiceSoapStub)new ServiceLocator().getServiceSoap(url);
org.apache.axis.message.SOAPHeaderElement header = new org.apache.axis.message.SOAPHeaderElement("http://www.abc.com/SSsample/","AuthHeader");
SOAPElement node = header.addChildElement("Username");
node.addTextNode("aat");
SOAPElement node2 = header.addChildElement("Password");
node2.addTextNode("sd6890");

((ServiceSoapStub) clientStub).setHeader(header);
Share:
44,297
razenha
Author by

razenha

See http://www.linkedin.com/in/rubemazenha for details.

Updated on July 28, 2022

Comments

  • razenha
    razenha almost 2 years

    I'm trying to consume a .NET 2.0 web service using Axis. I generated the web services client using Eclipse WST Plugin and it seems ok so far.

    Here the expected SOAP header:

    <soap:Header>
    <Authentication xmlns="http://mc1.com.br/">
        <User>string</User>
        <Password>string</Password>
    </Authentication>
    </soap:Header>
    

    I didn't find any documentation on how to configure this header from an Axis client. When I generated the client using Visual Studio C# Express 2008, it generates a class named Authentication with two String attributes (User and Password) and all the client methods receive an object of this class as first parameter, but it did not happen with Axis WS client.

    How can I set this header in my client calls?

  • Tarun Bhargav
    Tarun Bhargav over 13 years
    after so many frustrating hours, this is the answer i needed. thanks
  • talanb
    talanb about 13 years
    This was exactly what I needed!
  • bluish
    bluish over 11 years
    Which kind of object is MyAuthObj? Maybe the one that for the OP is Authentication? If so how can the client instantiate such an object?... Thanks!
  • Salman
    Salman almost 10 years
    SOAPHeaderElement authentication = new SOAPHeaderElement("http://mc1.com.br/","Authentication"); This statement gives me and error cannot initiate abstract class java how to resolve this issue?
  • Saurabh Gadariya
    Saurabh Gadariya almost 7 years
    What if header is having 2 soapElement like this: <soapenv:Header> <kpn:KpnHeader-v2> <kpn:RoutingInfo></kpn:RoutingInfo> </kpn:KpnHeader-v2> <oas:Security> <username></username> </oas:Security> </soapenv:Header>