390 likes | 911 Views
Pankaj Kumar ( pankaj_kumar@hp.com ), Software Architect, Web Services Management Organization, Hewlett Packard Co. Sep. 18, 2002. Web Services with JAX-RPC and Apache Axis. Session Objectives. Web Services in Perspective
E N D
Pankaj Kumar (pankaj_kumar@hp.com), Software Architect, Web Services Management Organization, Hewlett Packard Co. Sep. 18, 2002 Web Services withJAX-RPC and Apache Axis
Session Objectives • Web Services in Perspective • Learn about Web Services, wire-level interoperability standards and portable Java APIs. • Get to know JAX-RPC and Apache Axis to consume and produce Web Services.
Speaker Introduction • More than 12 years of development and project management experience • Worked on Web Services product development at HP • Expert Group Member of JAX-RPC and JSR109 • Contributor to Apache Axis and Cocoon projects • Author of open source project XPB4J (http://xpb4j.sf.net) • Frequent speaker at developer conferences • Authoring a book on J2EE and Web Services Security • Architect with HP Web Services Mgmt. Operation • Home Page: http://www.pankaj-k.net
Outline of the Session • Introduction to Web Services • Web Services Standards • Java support for Web Services • Apache Axis • Installing Apache Axis • Invoking a service • Deploying a service • Handlers • Serializers and Deserializers • Where to find more information
Web Services Infrastructure Language and platform independent infrastructure for loosely-coupled, inter-operable, app2app communication over the Internet.
Web Services (Contd.) • Language and platform independent => • separation of specification and implementation • Loosely coupled => • message based, synchronous and asynchronous interactions. • Over the Internet => • No centralized control, use of established protocols, security considerations. • Inter-operable => • Standards based.
Early (Internet) Technologies • SMTP/MIME • e-mail is still the killer app • FTP, NNTP • HTTP/HTTPS, HTML • the protocol behind Internet’s popularity Most of these facilitated app to human interaction over the Internet/intranet
Early (intranet) Technologies • DCE from OSF -- RPC based, procedural • ORB -- object oriented, mostly synchronous • CORBA, COM/DCOM from Microsoft, Java RMI/EJBs • MOM -- message oriented, synchronous as well as asynchronous • JMS ( Java API standard ) • Many proprietary implementations Most of these facilitated app2app interaction within a trusted intranet and without much consideration to interoperability across different implementations.
App2App Interaction -- the Web Services Way • Transport protocol • HTTP/HTTPS • Data Encoding • SOAP (Simple Object Access Protocol), XML Schema • Interface Description • WSDL (Web Services Description Language) • Service Description and Discovery • UDDI (Universal Description, Discovery and Integration) • Security • WS-Security, XML-Signature, XML-Encryption, ...
The Web Services Way Web Services standards (SOAP, WSDL, … ): based on widely accepted Internet friendly technologies (HTTP/HTTPS, XML, …), are mostly orthogonal to each other and enjoy broad support from vendors Web Services: Network accessible programs, expose functionality by receiving/sending SOAP messages over HTTP/HTTPS, and describe this interface as WSDL descriptions.
Additional Web Services Infrastructure Components • Key Management (Security) • XKMS • Web Services Management • OMI (Open Management Interface) • ... Interesting thing to note is that these are Web Services in themselves
SOAP In One Slide SOAP1.1 Message Structure SOAP Envelope • XML based protocol for exchange of information • Encoding rules for datatype instances • Convention for representing RPC invocations • Designed for loosely-coupled distributed computing • No remote references • Used with XML Schema • Transport independent • SOAP with Attachments allow arbitrary data to be packaged. Header Entries [Header Element] Body Element [Fault Element]
WSDL in One Slide WSDL1.1 Document Structure WSDL Document • A WSDL document describes • What the service can do • Where it resides • How to invoke it • WSDL are like IDL but lot more flexible and extensible • Defines binding for SOAP1.1, HTTP GET/POST and MIME • WSDL descriptions can be made available from an UDDI registry [Types] {Messages} {Port Types} {Bindings} {Services}
Java APIs for Web Services • SOAP messages as Java objects • SAAJ ( SOAP with Attachments API for Java) • Programming Model • JAX-RPC ( JSR101), JSR109, EJB2.1 • Accessing WSDL descriptions • JWSDL (JSR110) • Accessing Web Services Registries • JAXR (Java API for XML Registries)
SOAPPart SOAPMessage AttachmentPart Node SOAPFault SOAPElement SOAPFaultElement * SOAPBody SOAPHeader * * SOAPBodyElement SOAPHeaderElement SOAPEnvelope SAAJ Object Model
JAX-RPC • WSDL/XML to Java Mapping • Java to WSDL/XML Mapping • SOAP Message with Attachments • Client API • Classes generated from WSDL • Dynamic Proxy • DII call Interface • SOAP Message Handler • Extensible Type Mapping
WSDL description Service Client Service Endpoint Container WSDL<->Java Mapping Stub Dispatch JAX-RPC API JAX-RPC API Client Side JAX-RPC Runtime System Server Side JAX-RPC Runtime System Protocol (SOAP) Transport JAX-RPC Physical Architecture
WSDL description Client Service JAX-RPC impl. <Vendor A> Vendor prod. <Vendor C> Client Service Vendor prod. <Vendor B> J2EE Container <Vendor D> WSDL description Interoperability and JAX-RPC
Apache Axis • A SOAP Processing Engine • JAX-RPC Client System • JAX-RPC Server System ( Servlet based ) • SAAJ implementation • Flexible and extensible architecture • Tools, Examples, Documentation, … • A great place to learn about Web Services !! • Open-source, hosted by Apache Software Foundation • Ready for use ( RC1 released on Sep. 6)
Install & Deploy Apache Axis Direcotry Structure: • Make sure that you have • J2SE SDK 1.3 or 1.4: We will use 1.4 • A Servlet Container: We will use Tomcat4.0.1 • Download xml-axis-rc1-bin.zip from http://xml.apache.org/axis • Unzip it and look at the dir. tree. Note that Axis runs as a Servlet. • Deploy Axis. • Copy webapps\axis tree to webapps directory of Tomcat. • Alternatively, modify server.xml of Tomcat. • Run Tomcat: issue bin\startup from Tomcat home. axis-1_0 webapps lib docs samples axis WEB-INF lib classes web.xml ……
Test the Deployment • Point your browser to http://localhost:8080/axis
A Simple Example • AddFunction: A simple Java class with method to add two integers. Notice the filename extension – it is .jws ( for Java Web Service). • Deploy it. Just copy the AddFunction.jws file to webapps/axis directory. • Examine its WSDL description. Point your browser to http://localhost:8080/axis/AddFunction.jws?wsdl // File: AddFunction.jws public class AddFunction { int addInt(int a, int b){ return(a+b); } } Note: All sources with instructions to run are available at my web-site: http://www.pankaj-k.net
Writing the Client Program • There are many ways to write a Client program • Using Dynamic Invocation Interface ( DII) • Using generated Stubs from Service WSDL description • Using Dynamic Proxy • We will look at each of these Writing the client requires more work than writing the service
AddFunctionClient – using DII // File: lesson1\client\dii\AddFunctionClient.java, edited for presentation import javax.xml.rpc.Call; import javax.xml.rpc.Service; import javax.xml.namespace.QName; public class AddFunctionClient { public static void main(String [] args) { try { String endpoint = "http://localhost:8080/axis/AddFunction.jws"; Service service = new Service(); Call call = (Call) service.createCall(); call.setOperationName(new QName(endpoint, "addInt")); call.setTargetEndpointAddress( new java.net.URL(endpoint) ); Integer ret = (Integer)call.invoke(new Object[]{new Integer(5), new Integer(6)}); System.out.println("addInt(5, 6) = " + ret); } catch (Exception e) { System.err.println("Execution failed. Exception: " + e); } } }
AddFunctionClient – using Dynamic Proxy // File: lesson1\client\dproxy\AddFunctionClient.java, edited for presentation import javax.xml.namespace.QName; import javax.xml.rpc.*; public class AddFunctionClient { public static void main(String [] args) { try { String wsdlUrl = "http://localhost:8080/axis/AddFunction.jws?wsdl"; String nameSpaceUri = "http://localhost:8080/axis/AddFunction.jws"; String serviceName = "AddFunctionService"; String portName = "AddFunction"; ServiceFactory serviceFactory = ServiceFactory.newInstance(); Service afs = serviceFactory.createService(new java.net.URL(wsdlUrl), new QName(nameSpaceUri, serviceName)); AddFunctionServiceIntf afsIntf = (AddFunctionServiceIntf)afs.getPort( new QName(nameSpaceUri, portName), AddFunctionServiceIntf.class); System.out.println("addInt(5, 3) = " + afsIntf.addInt(5, 3)); } catch (Exception e) { System.err.println("Execution failed. Exception: " + e); } } }
AddFunctionClient – using Generated Stubs Generate the stubs: java org.apache.axis.wsdl.WSDL2Java \ http://localhost:8080/axis/AddFunction.jws?wsdl // File: lesson1\client\stub\AddFunctionClient.java, edited for presentation Import localhost.*; public class AddFunctionClient{ public static void main(String [] args) { try { AddFunctionService afs = new AddFunctionServiceLocator(); AddFunction af = afs.getAddFunction(); System.out.println("addInt(5, 3) = " + af.addInt(5, 3)); } catch (Exception e) { System.err.println("Execution failed. Exception: " + e); } } }
Deployment Descriptors • JWS deployment is simple, but has limitations: • You must have the source code • Can’t specify custom type mappings, handlers etc. • WSDD (Web Services Deployment Descriptors) allow more flexible deployments • Handlers in request or response path • Custom type mappings • Different transports – HTTP/S, TCP/IP, DIME • Different Dispatchers – Java Class, EJB, Servlet • …
Adding complexitiy to the Simple Example • AddFunction1: A simple Java class with method to add two Complex numbers. Complex is user defined Java class. • Deploy it. • Compile sources • Copy .class files. • Write deployment descriptor • Run AdminClient. • Examine its WSDL description. Point your browser to http://localhost:8080/axis/services/AddFunction1Service?wsdl // File: Complex.java public class Complex { public Complex(){} public double getR(){ … } public void setR(double r){ … } … public Complex add(Complex c){ … } // File: AddFunction1.java public class AddFunction1 { public Complex addComplex (Complex a, Complex b){ return a.add(b); } }
The Deployment Descriptor // File: lesson2\service\deploy.wsdd <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <handler name="print" type="java:LogHandler"/> <service name="AddFunction1Service" provider="java:RPC"> <requestFlow> <handler type="print"/> </requestFlow> <parameter name="className" value="AddFunction1"/> <parameter name="allowedMethods" value="*"/> <beanMapping qname="myNS:Complex" xmlns:myNS="urn:BeanService" languageSpecificType="java:Complex"/> </service> </deployment> Note: (1) xmlns:java (2) A handler in the request path (3) Dispatch to RPC provider (4) Bean type mapping
AddFunction1Client – using Generated Stubs Generate the stubs: java org.apache.axis.wsdlWSDL2Java \ http://localhost:8080/axis/services/AddFunction1Service?wsdl // File: lesson2\client\stub\AddFunction1Client.java, edited import localhost.*; import BeanService.*; public class AddFunction1Client { public static void main(String [] args) throws Exception { Complex a = new Complex(); Complex b = new Complex(); a.setR(10.0); a.setI(5.0); b.setR(3.0); b.setI(2.0); AddFunction1Service afs = new AddFunction1ServiceLocator(); AddFunction1 af = afs.getAddFunction1Service(); Complex ret = af.addComplex(a, b); System.out.println("addComplex(a + b) = (" + ret.getR() + ", " + ret.getI() + ")"); } } Generated class
Additional (Advanced!) Features • SOAP with Attachments • Custom type mappings (Pluggable Serializers) • One-way invocations • Document exchange • Dispatch to EJBs • HTTPS transport and mutual authentication • Username and password based authentication • …
Where to find more information? • Apache Axis Home: http://xml.apache.org/axis • Sun’s Web Services Developer Pack Home: http://java.sun.com/webservices/webservicespack.html • W3C’s Web Services Activity Home Page: http://www.w3.org/2002/ws/ • My Home Page: http://www.pankaj-k.net
Thank You