170 likes | 295 Views
CS603 Communication Mechanisms: SOAP. 25 January 2002. SOAP: Simple Object Access Protocol. Overview Goal: RPC protocol that works over wide area networks Interoperable Language independent Problem: Firewalls Solution: HTTP/XML History Work started in 1998 – produced XML-RPC
E N D
CS603Communication Mechanisms:SOAP 25 January 2002
SOAP:Simple Object Access Protocol • Overview • Goal: RPC protocol that works over wide area networks • Interoperable • Language independent • Problem: Firewalls • Solution: HTTP/XML • History • Work started in 1998 – produced XML-RPC • Vendor-led, big Microsoft influence • 1999: SOAP 1 – type system from XML Schemas • More vendors • 2001: Picked up by W3C – XML Protocol working group • Now called XP (XML Protocol) • Microsoft using it for their .NET replacement for DCOM
SOAP • Advantages • Goes anywhere • http is universal protocol • Open standard • Based on XML, defined by W3C working group • Disadvantages • Type semantics must be defined • Extra work for users • Pure text protocol • High cost to translate at endpoints • Eats bandwidth
SOAPComponents • Client side: Ability to generate http calls and listen for response Sounds like a browser! • Server: • Listen for HTTP • Bind to procedure • Respond with HTTP First and last are Web Server!
SOAP call <soap:Envelope> <soap:Body> <xmlns:m="http://www.stock.org/stock" /> <m:GetStockPrice> <m:StockName>IBM</m:StockName> </m:GetStockPrice> </soap:Body> </soap:Envelope>
SOAP response <soap:Envelope> <soap:Body> <xmlns:m="http://www.stock.org/stock" /> <m:GetStockPriceResponse> <m:Price>34.5</m:Price> </m:GetStockPriceResponse> </soap:Body> </soap:Envelope>
SOAP Template <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <soap:Header> User-created definitions, e.g. language of message </soap:Header> <soap:Body> Call and arguments, or results for a response </soap:Body> <soap:Fault> Errors (response only) </soap:Fault> </soap:Envelope>
Key SOAP Attributes • Header • Actor: URI of intended recipient • encodingStyle: URI of definition of types used • mustUnderstand: True if receiver MUST process element • Fault • <faultcode>: VersionMismatch, MustUnderstand, Client, Server • <faultstring>: Error as a string • <faultactor>: Who caused it • <detail>: Additional information
Building a client:Apache SOAP • Open source web server driven by IBM • SOAP available as integral part • Java packages to interface between java programs and SOAP • Also supports javascript SOAP clients/servers
SOAPSample Client import java.net.URL; import java.util.Vector; import org.apache.soap.SOAPException; import org.apache.soap.Constants; import org.apache.soap.Fault; import org.apache.soap.rpc.Call; import org.apache.soap.rpc.Parameter; import org.apache.soap.rpc.Response; public class Client { public static void main(String[] args) throws Exception { URL url = new URL("http://localhost:8080/apache-soap/servlet/rpcrouter"); Call call = new Call(); call.setTargetObjectURI("urn:Hello"); call.setMethodName(“HelloWorld"); call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); Vector params = new Vector(); params.addElement(new Parameter("name", String.class, “Argument”, null)); call.setParams(params);
SOAPSample Client Response resp = null; try { resp = call.invoke(url, ""); } catch( SOAPException e ) { System.err.println("Caught SOAPException (" + e.getFaultCode() + "): " +e.getMessage()); System.exit(-1); } // Check the response. if( !resp.generatedFault() ) { Parameter ret = resp.getReturnValue(); Object value = ret.getValue(); System.out.println(value); } else { Fault fault = resp.getFault(); System.err.println("Generated fault: "); System.out.println (" Fault Code = " + fault.getFaultCode()); System.out.println (" Fault String = " + fault.getFaultString()); } }
SOAPServer code public class HelloServer { public String HelloWorld(String name) { System.out.println(name); return "Hello World!”; } }
Activating the server • org.apache.soap.server.ServiceManagerClienthttp://localhost:8080/apache-soap/servlet/rpcrouter deploy DeploymentDescriptor.xml • DeploymentDescripter.xml: <isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment" id="urn:Hello"> <isd:provider type="java" scope="Application“ methods=“HelloWorld"> <isd:java class="HelloServer" static="false"/> </isd:provider> </isd:service>
Client-generated call <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <soap:Header> </soap:Header> <soap:Body> <ns1:HelloWorld xmlns:ns1="Hello" soap:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/"> <name xsi:type="xsd:string">Arguments</name> </ns1:HelloWorld> </soap:Body> </soap:Envelope>
Server-generated response <soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <soap:Body> <ns1:HelloWorld xmlns:ns1="Hello" soap:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/"> <return xsi:type="xsd:string">Hello World!</return> </ns1:HelloWorld> </soap:Body> </soap:Envelope>
DCE vs. Java RMI vs. SOAP • Philosophy • DCE RPC: generic interface • Define “clean sheet” system • Port to variety of protocols/systems/languages • Java RMI: “proprietary” interface • Coupled to single language/run time system • Port entire system to multiple platforms • SOAP: single standard interface • Define interface on single protocol • Pick protocol that is universal
Which do I use? • All-JAVA world? RMI • Need security / fault tolerance? RPC • Need to get through firewalls? SOAP • Performance? • Objects as arguments?