I have to ask: why do you need to work directly with sockets?  Do you have some 
requirement that you cannot use a SOAP library?

To answer your questions, the targetObjectURI is the namespace for the service, which 
effectively means it is the namespace of the method element.  That gets to your second 
question, the setMethodName is specifying the name of the method element.

Your SOAP payload should look something like
 
<?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/2001/XMLSchema-instance";
                      xmlns:xsd="http://www.w3.org/2001/XMLSchema";>
<SOAP-ENV:Body>
<ns1:getMeaning xmlns:ns1="urn:XcelXmlServer"
        SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";>
<wordToLookup xsi:type="xsd:string">toughWord</wordToLookup>
</ns1:getMeaning>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Scott Nichol

Do not send e-mail directly to this e-mail address,
because it is filtered to accept only mail from
specific mail lists.

----- Original Message ----- 
From: "Kapoor, Nishikant" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Thursday, December 11, 2003 1:02 PM
Subject: How to pass params to SOAP server using sockets?


Hello,

I have a question and I hope I'll be able to get some help from the list.

Most of the SOAP examples that I have seen and worked with so far use RPC to connect 
to  SOAP server as:
---------------start - RPC-----------------------
import org.apache.soap.rpc.*;
URL url = new URL("http://genx:80/soap/servlet/rpcrouter";);
Call call = new Call();
call.setTargetObjectURI("urn:XcelXmlServer");
call.setMethodName("getMeaning");
call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
Vector params = new Vector();
params.addElement (new Parameter ("wordToLookup", String.class, "toughWord", null));
call.setParams(params);
Response resp = call.invoke(url, "");
Fault fault = resp.getFault();
System.out.print (result.getValue());
---------------end - RPC -----------------------------

But, I need to use sockets instead:

---------------start - Socket -----------------------------
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
String host = "genx"; int port = 80;
String submitURL = "/soap/servlet/rpcrouter";
sslSocket = (SSLSocket)factory.createSocket(host, port);
sslSocket.startHandshake();
socket = new Socket(host, port);
out = new PrintWriter(new BufferedWriter(new 
OutputStreamWriter(socket.getOutputStream())));
out.println("POST " + submitURL + " HTTP/1.1");
out.println("Host: " + host);
out.println("Content-Type: text/xml");
out.println("Content-Length: " + "toughWord".length());
out.println("SOAPAction: \"\"" + "\n");
out.println(SOAP_HEADER + "\n" + toughWord + "\n" + SOAP_FOOTER);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while ((inputLine = in.readLine()) != null) System.out.println(inputLine);
socket.close();
---------------end - Socket -----------------------------

I have implemented service 'Dictionary' that has a method 'getMeaning'. I can access 
it via RPC but not via sockets. The values in the above code snippet are the exact 
values that I am using in my program.

My question is: Where (and how) in sockets do I specify the equivalent of

call.setTargetObjectURI("urn:XcelXmlServer");
call.setMethodName("getMeaning");


Thanks
Nishi

Reply via email to