Tools
For creating a JavaScript interaction with a Web service it is necessary to know the format of the SOAP request. For the masochists among us we could read the wsdl and work it out. However, I prefer to use the
Requires Free Membership to View
Scripting tool
Request/Response
The PHP test script shows you the request and response texts.
The request may require a SOAP Action. In this case it is possible to read it from the wsdl. However, as I am always running tcpdump for debug purposes I can check the outgoing tcp packet to get the SOAP Action from there.
Another tool used to test the requests is another widget I created. This widget allows me to send SOAP requests to services. Using this widget I can manipulate the request to test the service. The response is made available in the resultant scrollable text area (this widget will be covered in a future blog).
Implementation
Now that we have all the information needed, it is simply a case of making sure that the request is sent in the correct format and parsing the response. The code below contains the SOAP request for calling TH_USER_LIST and the XMLHttpRequest code.
function getSOAPEnvelope() { return '<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:sap-com:document:sap:rfc:functions"><SOAP-ENV:Body><ns1:TH_USER_LIST><LIST> <item><TID>0</TID><MANDT></MANDT> <BNAME></BNAME><TCODE></TCODE> <TERM></TERM><ZEIT></ZEIT><MASTER> </MASTER><HOSTADR></HOSTADR><TRACE>0</TRACE> <EXTMODI>0</EXTMODI><INTMODI>0</INTMODI> <TYPE>0</TYPE><STAT>0</STAT><PROTOCOL>0</PROTOCOL> <GUIVERSION></GUIVERSION><RFC_TYPE> </RFC_TYPE></item><item><TID>0</TID> <MANDT></MANDT><BNAME></BNAME> <TCODE></TCODE><TERM></TERM><ZEIT> </ZEIT><MASTER></MASTER><HOSTADR> </HOSTADR><TRACE>0</TRACE><EXTMODI>0</EXTMODI> <INTMODI>0</INTMODI><TYPE>0</TYPE> <STAT>0</STAT><PROTOCOL>0</PROTOCOL> <GUIVERSION></GUIVERSION><RFC_TYPE></RFC_TYPE> </item><item><TID>0</TID><MANDT></MANDT> <BNAME></BNAME><TCODE></TCODE><TERM> </TERM><ZEIT></ZEIT><MASTER></MASTER> <HOSTADR></HOSTADR><TRACE>0</TRACE> <EXTMODI>0</EXTMODI><INTMODI>0</INTMODI> <TYPE>0</TYPE><STAT>0</STAT> <PROTOCOL>0</PROTOCOL><GUIVERSION> </GUIVERSION><RFC_TYPE></RFC_TYPE> </item><item><TID>0</TID><MANDT></MANDT> <BNAME></BNAME><TCODE></TCODE><TERM> </TERM><ZEIT></ZEIT><MASTER></MASTER> <HOSTADR></HOSTADR><TRACE>0</TRACE> <EXTMODI>0</EXTMODI><INTMODI>0</INTMODI> <TYPE>0</TYPE><STAT>0</STAT> <PROTOCOL>0</PROTOCOL><GUIVERSION> </GUIVERSION><RFC_TYPE></RFC_TYPE></item><item> <TID>0</TID><MANDT></MANDT><BNAME> </BNAME><TCODE></TCODE><TERM></TERM> <ZEIT></ZEIT><MASTER></MASTER> <HOSTADR></HOSTADR><TRACE>0</TRACE> <EXTMODI>0</EXTMODI><INTMODI>0</INTMODI> <TYPE>0</TYPE><STAT>0</STAT> <PROTOCOL>0</PROTOCOL><GUIVERSION> </GUIVERSION><RFC_TYPE></RFC_TYPE> </item></LIST><USRLIST><item> <TID>0</TID><MANDT></MANDT><BNAME> </BNAME><TCODE></TCODE><TERM> </TERM><ZEIT></ZEIT><MASTER></MASTER> <TRACE>0</TRACE><EXTMODI>0</EXTMODI> <INTMODI>0</INTMODI><TYPE>0</TYPE> <STAT>0</STAT><PROTOCOL>0</PROTOCOL> <GUIVERSION></GUIVERSION><RFC_TYPE> </RFC_TYPE><HOSTADDR></HOSTADDR> </item><item><TID>0</TID><MANDT> </MANDT><BNAME></BNAME><TCODE> </TCODE><TERM></TERM><ZEIT> </ZEIT><MASTER></MASTER><TRACE>0</TRACE> <EXTMODI>0</EXTMODI><INTMODI>0</INTMODI> <TYPE>0</TYPE><STAT>0</STAT> <PROTOCOL>0</PROTOCOL><GUIVERSION> </GUIVERSION><RFC_TYPE></RFC_TYPE> <HOSTADDR></HOSTADDR></item> <item><TID>0</TID><MANDT> </MANDT><BNAME></BNAME><TCODE> </TCODE><TERM></TERM><ZEIT> </ZEIT><MASTER></MASTER><TRACE>0</TRACE> <EXTMODI>0</EXTMODI><INTMODI>0</INTMODI> <TYPE>0</TYPE><STAT>0</STAT> <PROTOCOL>0</PROTOCOL><GUIVERSION> </GUIVERSION><RFC_TYPE></RFC_TYPE> <HOSTADDR></HOSTADDR></item> <item><TID>0</TID><MANDT> </MANDT><BNAME></BNAME><TCODE> </TCODE><TERM></TERM><ZEIT> </ZEIT><MASTER></MASTER> <TRACE>0</TRACE><EXTMODI>0</EXTMODI> <INTMODI>0</INTMODI><TYPE>0</TYPE> <STAT>0</STAT><PROTOCOL>0</PROTOCOL> <GUIVERSION></GUIVERSION><RFC_TYPE> </RFC_TYPE><HOSTADDR></HOSTADDR> </item><item><TID>0</TID><MANDT> </MANDT><BNAME></BNAME><TCODE> </TCODE><TERM></TERM><ZEIT></ZEIT> <MASTER></MASTER><TRACE>0</TRACE> <EXTMODI>0</EXTMODI><INTMODI>0</INTMODI> <TYPE>0</TYPE><STAT>0</STAT> <PROTOCOL>0</PROTOCOL><GUIVERSION> </GUIVERSION><RFC_TYPE></RFC_TYPE> <HOSTADDR></HOSTADDR></item> </USRLIST></ns1:TH_USER_LIST> </SOAP-ENV:Body></SOAP-ENV:Envelope>'; } this.performSearch = function() { // Assemble a SOAP envelope var soapEnvelope = getSOAPEnvelope(); log(soapEnvelope); // Access the web service httpRequest = new XMLHttpRequest(); httpRequest.onreadystatechange = this.callback; with(httpRequest) { open('POST', self.service, true, gUserValue,gPassValue); // 'false' = synchronous, 'true' = asynchronous setRequestHeader('Content-Type', 'text/xml'); setRequestHeader('SOAPAction' , gActionValue); setRequestHeader('Connection' , 'close'); send(soapEnvelope); } };
This content is reposted from the SAP Developer Network.
Copyright 2006, SAP Developer Network
SAP Developer Network (SDN) is an active online community where ABAP, Java, .NET, and other cutting-edge technologies converge to form a resource and collaboration channel for SAP developers, consultants, integrators, and business analysts. SDN hosts a technical library, expert blogs, exclusive downloads and code samples, an extensive eLearning catalog, and active, moderated discussion forums. SDN membership is free.
Want to read more from this author? Click here to read John Astill's Weblog. Click here to read more about Scripting Languages on SDN.
This was first published in November 2006

Join the conversationComment
Share
Comments
Results
Contribute to the conversation