Describing Web Services An Overview of WSDL CS595G: Web Services and Security 1/17/2006 Marco Cova marco@cs.ucsb.edu Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 1/33 Outline ● Motivations ● WSDL specification and an example ● Tools ● WSDL alternatives Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 2/33 Web Services Interaction Typical steps in WS interaction: ● ● ● ● Discovery: the requester entity becomes aware of the provider entity either by directly knowing the provider agent's address or through some discovery service Agreement on service description: provider and requester agent “agree” on the service description Agents setup: web service description and semantics are input to requester and provider agents Messages are exchanged between the requester and provider agents Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 3/33 Web Services Stack Here, we will focus on the service description layer and WSDL specifically Image taken from http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/images/smith_wsc_f1.gif Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 4/33 Web Services description: goals and requirements ● To provide a structured, formal description of a web service: What operations are available and how to invoke them To describe how to concretely access a web service: – ● Web service address – Transport protocol What type of description: syntactical or semantic? – ● Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 5/33 WSDL ● ● Web Service Definition Language: a language to describe web services XML-based Status: ● ● WSDL 1.1 is a W3C note published on 15 March 2001 WSDL 2.0 is a W3C Candidate Recommendation (last update on 6 January 2006) Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 6/33 WSDL goals ● Service description: documentation for distributed systems – ● Language- and platform-independent Service automation: recipe for automating the details involved in the service invocation Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 7/33 WSDL: web service model A WSDL document defines a web services as ● Collection of communicating endpoints capable of exchanging messages For each web service, WSDL may provide two types of definitions: ● ● Abstract: the web service is seen as a languageand platform-independent interface Concrete: the web service is seen as a component accessible through specific transport and network standards Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 8/33 WSDL elements Main WSDL elements: ● ● ● ● ● ● ● Types: container for data type definitions using some type system, typically XML Schema Message: an abstract, typed definition of the data being communicated Operation: an abstract description of an action supported by the service Port Type: an abstract set of operations supported by one or more endpoints Binding: a concrete protocol and data format specification for a particular port type Port: a single endpoint defined as a combination of a binding and a network address Service: a collection of related endpoints Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 9/33 WSDL elements – cnt'd For each part of the specification, an example taken from the Amazon E-Commerce Service is presented. The full WSDL document is located at http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 10/33 wsdl:types <definitions .... > <types> <-- type-system extensibility element --> * </types> </definitions> ● ● Data type definitions needed to define the exchanged messages By default, the types are defined in terms of XML Schema Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 11/33 wsdl:types - example <types> ... <xs:element name="ItemSearch"> <xs:complexType><xs:sequence> <xs:element name="SubscriptionId" type="xs:string" minOccurs="0"/> <xs:element name="AWSAccessKeyId" type="xs:string" minOccurs="0"/> <xs:element name="AssociateTag" type="xs:string" minOccurs="0"/> <xs:element name="XMLEscaping" type="xs:string" minOccurs="0"/> <xs:element name="Validate" type="xs:string" minOccurs="0"/> <xs:element name="Shared" type="tns:ItemSearchRequest" minOccurs="0"/> <xs:element name="Request" type="tns:ItemSearchRequest" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType></xs:element> ... </types> Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 12/33 wsdl:message <definitions .... > <message name="nmtoken"> * <part name="nmtoken" element="qname"? type="qname"?/> * </message> </definitions> ● ● Messages exchanged to provide a service Messages are simply containers of parts which are defined in terms of the types described in the types section Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 13/33 wsdl:message - example <message name="ItemSearchRequestMsg"> <part name="body" element="tns:ItemSearch"/> </message> <message name="ItemSearchResponseMsg"> <part name="body" element="tns:ItemSearchResponse"/> </message> Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 14/33 wsdl:portType <wsdl:definitions .... > <wsdl:portType name="nmtoken"> <wsdl:operation name="nmtoken" .... /> * </wsdl:portType> </wsdl:definitions> ● A portType is a named set of abstract operations and the abstract messages involved Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 15/33 Message exchange patterns 4 messaging types: ● ● ● ● One-way: endpoint receives a message Request-response: endpoint receives a message, and sends a correlated message Solicit-response: endpoint sends a message, and receives a correlated message. Notification: endpoint sends a message Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 16/33 wsdl:portType - example <portType name="AWSECommerceServicePortType"> ... <operation name="ItemSearch"> <input message="tns:ItemSearchRequestMsg"/> <output message="tns:ItemSearchResponseMsg"/> </operation> ... </portType> In addition, a message can be used to communicate a fault: <fault message=”...”/> Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 17/33 wsdl:binding <wsdl:definitions .... > <wsdl:binding name="nmtoken" type="qname"> * <-- extensibility element (1) --> * <wsdl:operation name="nmtoken"> * <-- extensibility element (2) --> * <wsdl:input name="nmtoken"? > ? <-- extensibility element (3) --> </wsdl:input> <wsdl:output name="nmtoken"? > ? <-- extensibility element (4) --> * </wsdl:output> <wsdl:fault name="nmtoken"> * <-- extensibility element (5) --> * </wsdl:fault> </wsdl:operation> </wsdl:binding> </wsdl:definitions> ● Message format and protocol details for operations and messages defined by a portType Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 18/33 wsdl:binding – cnt'd ● ● Extensibility elements allow to specify – Concrete grammar for input, output and fault messages – Concrete per-binding information – Concrete per-operation information The WSDL specification introduces binding extensions for: – SOAP – HTTP GET/POST – MIME Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 19/33 wsdl:binding - example <binding name="AWSECommerceServiceBinding" type="tns:AWSECommerceServicePortType"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> ... <operation name="ItemSearch"> <soap:operation soapAction="http://soap.amazon.com"/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> ... </binding> Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 20/33 wsdl:port <wsdl:definitions .... > <wsdl:service .... > * <wsdl:port name="nmtoken" binding="qname"> * <-- extensibility element (1) --> </wsdl:port> </wsdl:service> </wsdl:definitions> ● Defines an individual endpoint by specifying an address for a binding Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 21/33 wsdl:port - example <service name="AWSECommerceService"> <port name="AWSECommerceServicePort" binding="tns:AWSECommerceServiceBinding"> <soap:address location="http://soap.amazon.com/onca/soap?Service=AWSECommerce Service"/> </port> </service> Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 22/33 wsdl:service <wsdl:definitions .... > <wsdl:service name="nmtoken"> * <wsdl:port .... />* </wsdl:service> </wsdl:definitions> ● A service simply groups related ports together Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 23/33 Tools: editor How do you write WSDL files? ● ● By hand: some editors have special support for WSDL Don't write them: automatic generation (in a few slides) Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 24/33 Tools: validation ● ● WSDL documents can be quite large (the Amazon E-Commerce Service WSDL document is 2432 lines of code and over 100KB) Tools to validate/analyze WSDL documents: – http://xmethods.net/ve2/Tools.po – http://www.softwaresecretweapons.com/jspwiki/ services/oy-lm-1.3/generator.jsp Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 25/33 Tools: WSDL generation and client generation ● ● ● Manually creating a WSDL file for a web service is a difficult and error-prone task Given a WSDL file, generating a client to interact with the service is a repetitive task There exist toolkits for all major languages that allow to automate both tasks Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 26/33 WSDL toolkit: Java ● Axis: http://ws.apache.org/axis/ – Builds stubs, skeleton and data types from WSDL ● – java org.apache.axis.wsdl.WSDL2Java AWSECommerceService.wsdl Builds WSDL from Java code ● java org.apache.axis.wsdl.Java2WSDL -o wp.wsdl -l "http://localhost:8080/axis/services/WidgetPrice n"urn:Example6" p"samples.userguide.example6" "urn:Example6" samples.userguide.example6.WidgetPrice Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 27/33 WSDL toolkit: Python ● SOAPpy: http://pywebsvcs.sourceforge.net/ ● Parsing a WSDL file: >>> from SOAPpy import WSDL >>> wsdlFile = 'http://webservices.amazon.com/AWSECommerceService/AWSECommerce Service.wsdl' >>> server = WSDL.Proxy(wsdlFile) >>> server.methods.keys() [u'SellerListingSearch', u'CartCreate', u'SellerLookup', u'Help', u'TransactionLookup', u'CartAdd', u'ItemLookup', u'MultiOperation', u'SimilarityLookup', u'CartClear', u'ListLookup', u'CartModify', u'CustomerContentLookup', u'ListSearch', u'BrowseNodeLookup', u'CartGet', u'SellerListingLookup', u'CustomerContentSearch', u'ItemSearch'] Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 28/33 WSDL toolkit: Python – cnt'd >>> itemSearchM = server.methods['ItemSearch'] >>> for inparams in itemSearchM.inparams: ... print inparams.name, inparams.type ... body (u'http://webservices.amazon.com/AWSECommerceService/200510-05', u'ItemSearch') >>> >>> for outparams in itemSearchM.outparams: ... print outparams.name, outparams.type ... body (u'http://webservices.amazon.com/AWSECommerceService/200510-05', u'ItemSearchResponse') >>> result = server.ItemSearch({'body': {'SubscriptionId': 'xxxxxxxxxxxxxxxxxxxx', 'SearchIndex': 'Books', 'Request' : {'SearchIndex': 'Books', 'Title': 'restaurant end universe'}}}) >>> result.Items.TotalPages 2 >>> result['Items'].TotalResults '18' Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 29/33 WSDL toolkit: Python – cnt'd >>> result.Items.Item[0] <SOAPpy.Types.structType Item at -1214384084>: {'ItemAttributes': <SOAPpy.Types.structType ItemAttributes at 1214386100>: {'Title': 'The Restaurant at the End of the Universe', 'ProductGroup': 'Book', 'Author': 'Douglas Adams'}, 'ASIN': '0345391810', 'DetailPageURL': 'http://www.amazon.com/exec/obidos/redirect?tag=ws%26link_code= sp1%26camp=2025%26creative=165953%26path=http://www.amazon.com/ gp/redirect.html%253fASIN=0345391810%2526tag=ws%2526lcode=sp1%2 526cID=2025%2526ccmID=165953%2526location=/o/ASIN/0345391810%25 253FSubscriptionId=xxxxxxxxxxxxxxxxxxxx'} Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 30/33 Lessons learned ● ● ● Working with complex types is... complex and not very interoperable Editing WSDL files by hand is masochistic. Avoid it as much as you can If everything seems fine but nothing works, double check your namespaces Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 31/33 Alternatives ● ● ● ● At the moment, WSDL 1.1 is “the” web service description language WSDL 2.0 redefines and cleans up the grammar specified by WSDL Simplify the XSD, SOAP/REST, WSDL stack: SSDL (SOAP Service Description Language), RESEDEL (REstful SErvices DEscription Language), WRDL (Web Resource Description Language), WADL (Web Application Description Language), SMEX-D (Simple Message EXchange Descriptor), WDL (Web Description Language) Add semantics description of a service: WSDL-S, WSML (Web Service Modeling Language) Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 32/33 End ● Questions? Marco Cova – Describing Web Services: An Overview of WSDL – CS595G - 33/33