SOAP Simple Object Access Protocol Hva er SOAP? SOAP sikter å løse noe av de samme problemene som CORBA prøver å løse I motsetning til CORBA er SOAPs designmål å være enkel. Standardisert av W3C etter forslag fra Microsoft, IBM, Lotus m. f. 1
Hvor enkel? Enkel! 2
XML / HTTP SOAP bruker XML. XML sendes over HTTP SOAP spesifiserer bare melding fra en sender til en mottager Alt utover dette er uspesifisert (som for eksempel klient / tjener modell for meldinger) og er ment implementert i applikasjonen. (SOAP 1.1) Struktur 3
Tre Hoveddeler Envelopen Encoding Rules RPC Representation 4
Envelope Envelope Header Actor Must understand Body Rpc kall encoding Encoding rules Definerer hvordan data skal marshalles. Int, float String Array Kan bare sende deler av arrayen, offset Enumeration 5
RPC Definerer hvordan en metode skal kalles. Adressen til SOAP noden Metodenavn Parameterne til metoden Hvordan kallet skal bindes til objekter på den andre siden sier spesifikasjonen ikke noe om SOAP vs. DCOM Begge to støtter en service orientert arkitektur DCOM bruker Microsoft sin RPC protokoll TCP/IP Etter autentifisering på definerte porter tildeles porter for kommunikasjonen dynamisk Problemer med brannvegger SOAP bruker XML Samme port som HTML (port 80) 6
SOAP vs. CORBA SOAP benytter seg som sagt av XML som sendes over HTTP CORBA benytter seg av sin egen IIOP (Inter- ORB Protocol) Begge kan brukes til å gjøre RPC På protokollnivå er de ganske like, det er derfor egentlig mer rettferdig å sammenligne SOAP med CORBA sin IIOP SOAP er rimelig nytt i forhold til CORBA som er fra slutten av 80-tallet Fordeler med SOAP CORBA er mye mer formelt enn SOAP, så programmererne har mye større frihet SOAP bruker XML som kommunikasjonsspråk, dette gjør det mye enklere å kommunisere mellom platformer SOAP kan bruke flere transport og applikasjonsprotokoller (for eksempel HTTP, SMTP, HTTPS og TCP/IP) de må bare defineres i bindingsinformasjonen som sendes med WSDL beskrivelsen 7
Fordeler med SOAP Kommunikasjonen igjennom allerede brukte porter (for eksempel port 80 HTTP) gjør at SOAP lett kan kombineres med branvegger SOAP bindinger er implementert i de fleste store programmeringsspråk C, C++, C#, Java, Virtual Basic, Delphi, Pearl, Python, PHP, JavaScript, Smaltalk. Flere store leverandører støtter SOAP, blant annet Microsoft Ulemper med SOAP Veldig mange implementasjoner av SOAP, alle fungerer ikke like godt sammen SOAP er en rimelig ny standard. CORBA er moden, og har vært lenge på markedet Mangel på standardiserte tjenester. Den eneste standardiserte tjenesten i SOAP er UDDI interface. Den mangler blant annet: event-service, transaksjonstjeneste og sikkerhetstjeneste 8
Ulemper med SOAP Det er ganske tungvindt å gjøre en SOAP request. SOAP programmereren må definere, lage en beskjed og sende den. Svaret kommer i XML, og da må vi fiske ut dataene som er svaret på forespørselen Bruken er XML er tyngre for systemene. Selv om XML er enkel å lese, er CPU og minnekravene for å parse dokumentene store. Komplekse schma er eller DTD er gjør også at denne prosessen går sakte kan gå meget sakte Det er derfor et stort overhead i forhold til binære protokoller som CORBA IIOP når XML skal transporteres. Den totale datamengden som sendes er meget liten sammenlignet med den totale mengden som skal sendes. I gjennomsnitt er overheadet på rundt 30% SOAP mot CORBA stack CORBA stack IDL CORBA Services CORBA Stubs/Skeletons CDR binary encoding GIOP/IIOP TCP/IP SOAP stack WSDL UDDI SOAP Message XML Unicode encoding HTTP TCP/IP 9
Oppsummering Aspect Data model Client-Server coupling Location transparency Type system Error handling Serialization Parameter passing Transfer syntax State Request semantics Runtime composition Registry Service discovery Language support Security Firewall Traversal Events CORBA Object model Tight Object references IDL IDL exception built into the ORB by reference and value (valuetype) CDR used on the wire binary format stateful at-most-once DII Interface Repository Implementation repository CORBA naming/trading service RMI registry any language with an IDL binding CORBA security service work in progress CORBA event service SOAP SOAP message exchange model Loose URL XML schemas SOAP fault messages can be chosen by the user by value (no notion of objects) XML used on the wire Unicode stateless defined by SOAP UDDI/WSDL UDDI/WSDL UDDI any language HTTP/SSL, XML signature uses HTTP port 80 N/A Corba basert interface module c_echo { /** En bruker definert type */ struct EchoData { long along; boolean abool; string astring; }; /** Liste med data typer */ typedef sequence< EchoData > EchoDataList; interface Echo { /** Noen built-in typer og en bruker definert type som returverdi. */ EchoData getdata( in long l, in boolean b, in string s ); }; }; /** En liste og en ut parameter */ EchoDataList getdatalist( in long size, out long real_size ); 10
SOAP/WDSL basert interface <?xml version="1.0" encoding="utf-8"?> <Service xmlns = "http://esd.esoapcg.com/esd/" xmlns:typens = "http://schemas.esoap.com/types/" xmlns:cfg = "http://schemas.esoap.com/config/" xmlns:esd = "http://esd.esoapcg.com/esd/" xmlns:soap = "http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd = "http://www.w3.org/2001/xmlschema" xmlns:wsdl = "http://schemas.xmlsoap.org/wsdl/" name = "s_echo" targetnamespace = "http://http://www.uio.no/studier/emner/matnat/ifi/inf5040/h04/" > <! Bruker definert type. --> <esd:ctype name="echodata" > <esd:item name="along" type="xsd:int" builtin="true" array="false" inout="false"/> <esd:item name="abool" type="xsd:boolean" builtin="true" array="false" inout="false"/> <esd:item name="astring" type="xsd:string" builtin="true" array="false" inout="false"/> </esd:ctype> SOAP/WDSL basert interface <esd:atype name="echodatalist" builtin="false" type="typens:echodata[ ]" stype ="typens:echodata"/> <! Interface som illustrerer hovedlikheter mellom Corba og SOAP. --> <esd:interface name = "Echo" soapaction = "http://http://www.uio.no/studier/emner/matnat/ifi/inf5040/h04/" namespace = "http://http://www.uio.no/studier/emner/matnat/ifi/inf5040/h04/" location = "http://http://www.uio.no/studier/emner/matnat/ifi/inf5040/h04/"> <! Noen built-in typer og en bruker definert type som returverdi. --> <esd:method name="getdata"> <esd:inparam name="getdatarequest"> <esd:item name="l" type="xsd:int" builtin="true" array="false" inout=" false"/> <esd:item name="b" type="xsd:boolean" builtin="true" array="false" inout=" false"/> <esd:item name="s" type="xsd:string" builtin="true" array="false" inout=" false"/> </esd:inparam> <esd:outparam name="getdataresponse"> <esd:item name="return" type="typens:echodata" builtin="false" array="false" inout="false"/> </esd:outparam> </esd:method> 11
SOAP/WDSL basert interface <!-- En liste og en ut parameter. --> <esd:method name="getdatalist"> <esd:inparam name="getdatalistrequest"> <esd:item name="size" type="xsd:int" builtin="true" array="false" inout=" false"/> </esd:inparam> <esd:outparam name="getdatalistresponse"> <esd:item name="return" type="typens:echodata" builtin="false" array="true" inout="false"/> <esd:item name="real_size" type="xsd:int" builtin="true" array="false" inout= "false"/> </esd:outparam> </esd:method> </esd:interface> </Service> RPC og HTTP Vi har en web server som tilbyr en metode som tar imot en by og et fylke og returnere et post nummer Vi vet ikke hvordan metoden er implementert Det eneste vi vet er hvordan vi skal få tak i metoden Metode er definert slik: string GetZipCode ( string city, string state ); 12
XML Melding POST /call.asp HTTP/1.1 Content-Type: text/xml Content-Length: ### SOAPAction: "urn:ificodes" <soap:envelope xmlns:soap=http://schemas.xmlsoap.org/soap/envelope/ soap:encodingstyle=http://schemas.xmlsoap.org/soap/encoding/ xmlns:xsi="http://www.w3.org/1999/xmlschema-instance" xmlns:xsd="http://www.w3.org/1999/xmlschema"> <soap:body> <m:getzipcode xmlns:m="http://http://www.uio.no/ifi/inf5040/h04/methods/"> <city xsi:type="xsd:string">arendal</city> <state xsi:type="xsd:string">aust-agder</state> </m:getzipcode> </soap:body> </soap:envelope> XML Svar HTTP/1.1 200 OK Content-Type: text/xml Content-Length: ### <soap:envelope xmlns:soap=http://schemas.xmlsoap.org/soap/envelope/ soap:encodingstyle=http://schemas.xmlsoap.org/soap/encoding/ xmlns:xsi=http://www.w3.org/1999/xmlschema-instance xmlns:xsd="http://www.w3.org/1999/xmlschema"> <soap:body> <m:getzipcoderesponse xmlns:m= http://http://www.uio.no/ifi/inf5040/h04/methods/"> <zip xsi:type="xsd:string">4800</zip> </m:getzipcoderesponse> </soap:body> </soap:envelope> 13
Konklusjon SOAP er enkelt! 14