You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by Glen Daniels <gd...@macromedia.com> on 2001/09/28 23:04:14 UTC
RE: How to get/pass header session information
Good catch, Mark.
I think the right solution to this might be to add APIs like this to
ServiceClient:
public void addHeader(SOAPHeader header)
public void clearHeaders()
This would allow the user to add headers to outgoing messages. I'm not
sure, but I think a good default might be to persist the headers across
invoke()s unless clearHeaders() is called, which would enable very easy
usage in scenarios like the session one you mention.
Axis-dev'ers? +1, -1?
--Glen
> -----Original Message-----
> From: Mark Roder [mailto:mroder@wamnet.com]
> Sent: Friday, September 28, 2001 4:02 PM
> To: 'axis-user@xml.apache.org'
> Subject: RE: How to get/pass header session information
>
>
>
> I figured out how to get the session information by doing the
> following:
> User aUser=ArchiveDataTEST.getValidUser();
> RPCParam userParam = new RPCParam("User", aUser) ;
>
> String endpoint =
> "http://localhost:80/cgi-bin/wambase/mvsrch_front";
>
> ServiceClient client = new ServiceClient(endpoint);
> client.addOption(AxisEngine.PROP_DOMULTIREFS, new Boolean(false));
> client.addSerializer(User.class,new QName(),new BeanSerializer());
> String ret = (String)client.invoke("Login",
> new Object []
> {userParam });
> Message msg = client.getResponseMessage();
> SOAPEnvelope env=msg.getAsSOAPEnvelope();
> SOAPHeader sessionHeader =
> env.getHeaderByName("urn:schemas-wamnet-com:Session","SessionID");
> String aString = (String) sessionHeader.getValueAsType(new
> QName(Constants.URI_2001_SCHEMA_XSD, "string"));
>
> String sessionId = aString.trim();
> System.out.println("SessionID:" +sessionId);
>
> I can create(I think it works) a header using the following code:
> Document doc = XMLUtils.newDocument();
> Element element =
> doc.createElement(ArchiveConstants.NS_SESSION_ID);
> element.setAttribute(ArchiveConstants.NS_AUTH_REF,
> ArchiveConstants.NS_AUTH_URI);
> element.appendChild(doc.createTextNode(sessionId));
> SOAPHeader sessionHeader = new SOAPHeader(element);
>
> Now that I have the SOAPHeader, it looks like ServiceClient
> is written in a
> way that doesn't allow me to add my own SOAPHeaders to a message.
>
> The invoke(method,args) creates a RPCElement and then runs
> invoke(RPCElement).
>
> The invoke(RPCElement) creates the SOAPEnvelope and adds the
> body, creates
> the message, calls invoke() and then decodes the response.
>
> What I want to do is add my own header after the
> invoke(RPCElement) does the
> work of setting up the message but before invoke() is called.
>
> Options:
> Option1: I started down the wrong path and there is an easier way.
> Option2:
> Change how the invoke methods are called so that the
> RPC invokes call
> a "createEnvelope(method,args)" method that returns a
> SOAPEnvelope. They
> then call the invoke(SOAPEnvelope) method to make the call. A
> "decode(SOAPEnvelope)" method will then return the object.
> This is breaking
> up the current invoke(RPCElement) method into the part above
> invoke() and
> below invoke().
>
> This change would allow me to do the following in my code:
>
> reqEnv = client.createMessage(method,args);
> reqEnv.addHeader(myHeader);
> responseEnv = client.invoke(reqEnv);
> resultObject = client.decode(responeEnv)
>
> Option3: Make a method that you can pass in a header for
> the message
>
> Does this make sense? Am I missing something?
>
> Later
>
> Mark
>
>
>
>
>
>
> -----Original Message-----
> From: Mark Roder [mailto:mroder@wamnet.com]
> Sent: Friday, September 28, 2001 12:29 PM
> To: 'axis-user@xml.apache.org'
> Subject: How to get/pass header session information
>
>
>
> I am just starting to use axis, so this may be simple. I am
> working on a
> soap client application hitting an existing server.
>
> How do I pull the session information out of the header of
> the following
> response?
>
> Then, how do I add it all following requests?
>
>
> My current code:
>
> User aUser=ArchiveDataTEST.getValidUser();
> RPCParam userParam = new RPCParam("User", aUser) ;
>
> String endpoint =
"http://localhost:80/cgi-bin/wambase/mvsrch_front";
ServiceClient client = new ServiceClient(endpoint);
client.addOption(AxisEngine.PROP_DOMULTIREFS, new Boolean(false));
client.addSerializer(User.class,new QName(),new BeanSerializer());
String ret = (String)client.invoke("Login",
new Object [] {userParam });
System.out.println("Sent 'Hello!', got '" + ret + "'");
Response I need to get session information out of:
HTTP/1.1 200 OK Date: Fri, 28 Sep 2001 16:39:10 GMT Server: Apache/1.3.11
(Unix) mod_ssl/2.5.0 OpenSSL/0.9.4 Connection: close Content-Type: text/xml
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<soap:Header>
<auth:SessionID xmlns:auth="urn:schemas-wamnet-com:Session"
soap:mustUnderstand="1">
ses09281011739119691.id
</auth:SessionID>
</soap:Header>
<soap:Body>
<m:LoginResponse xmlns:m="urn:schemas-wamnet-com:Archive" />
</soap:Body>
</soap:Envelope>
Example request I need to put the session information into:
POST /cgi-bin/wambase/mvsrch_front HTTP/1.0 Host: localhost Content-Type:
text/xml; charset=utf-8 Content-Length: 608 SOAPAction:
"urn:schemas-wamnet-com:Archive#GetLibraries" <?xml version='1.0'
encoding='UTF-8'?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<SOAP-ENV:Header>
<auth:SessionID soap:mustUnderstand="1"
xmlns:auth="urn:schemas-wamnet-com:Authentication">
ses09281011809017084.id </auth:SessionID>
</SOAP-ENV:Header>
<SOAP-ENV:Body> <ns1:GetLibraries xmlns:ns1="urn:schemas-wamnet-com:Archive"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
</ns1:GetLibraries> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Thanks
Mark