Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Web Services with JAX-RPC and Apache Axis Sep. 18, 2002 Pankaj Kumar ([email protected]), Software Architect, Web Services Management Organization, Hewlett Packard Co. 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. Wednesday, May 24, 2017 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 Wednesday, May 24, 2017 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 Wednesday, May 24, 2017 Web Services Infrastructure Language and platform independent infrastructure for loosely-coupled, inter-operable, app2app communication over the Internet. Wednesday, May 24, 2017 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. Wednesday, May 24, 2017 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 Wednesday, May 24, 2017 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. Wednesday, May 24, 2017 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, ... Wednesday, May 24, 2017 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. Wednesday, May 24, 2017 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 Wednesday, May 24, 2017 SOAP In One Slide • XML based protocol for exchange of information – Encoding rules for datatype instances – Convention for representing RPC invocations • Designed for loosely-coupled distributed computing SOAP1.1 Message Structure SOAP Envelope Header Entries [Header Element] – No remote references • Used with XML Schema • Transport independent • SOAP with Attachments allow arbitrary data to be packaged. Body Element [Fault Element] Wednesday, May 24, 2017 WSDL in One Slide • 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 WSDL1.1 Document Structure WSDL Document [Types] {Messages} {Port Types} {Bindings} {Services} Wednesday, May 24, 2017 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) Wednesday, May 24, 2017 SAAJ Object Model SOAPPart SOAPMessage AttachmentPart Node SOAPFault SOAPElement SOAPFaultElement SOAPBody SOAPHeader * SOAPBodyElement SOAPHeaderElement * SOAPEnvelope Wednesday, May 24, 2017 * 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 Wednesday, May 24, 2017 JAX-RPC Physical Architecture WSDL description Service Client Stub Service Endpoint Container WSDL<->Java Mapping Dispatch JAX-RPC API Client Side JAX-RPC Runtime System JAX-RPC API Server Side JAX-RPC Runtime System Protocol (SOAP) Transport Wednesday, May 24, 2017 Interoperability and JAX-RPC Client WSDL description Service JAX-RPC impl. <Vendor A> Vendor prod. <Vendor C> Client Service Vendor prod. <Vendor B> J2EE Container <Vendor D> WSDL description Wednesday, May 24, 2017 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) Wednesday, May 24, 2017 Install & Deploy Apache Axis • 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. Direcotry Structure: axis-1_0 webapps lib docs samples axis WEB-INF lib classes web.xml …… Wednesday, May 24, 2017 Test the Deployment • Point your browser to http://localhost:8080/axis Wednesday, May 24, 2017 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/AddFu nction.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 Wednesday, May 24, 2017 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 Wednesday, May 24, 2017 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); } } } Wednesday, May 24, 2017 Compiling and Running the DII Client Wednesday, May 24, 2017 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); } } Wednesday, May } 24, 2017 Compiling and Running the Dynamic Proxy Client Wednesday, May 24, 2017 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); } } } Wednesday, May 24, 2017 Generating Stubs, Compiling and Running the Stub Client Wednesday, May 24, 2017 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 … Wednesday, May 24, 2017 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/servic es/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); } } Wednesday, May 24, 2017 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 Wednesday, May 24, 2017 Deploying the Service Wednesday, May 24, 2017 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 Wednesday, May 24, 2017 Running the Client Wednesday, May 24, 2017 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 … Wednesday, May 24, 2017 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 Wednesday, May 24, 2017 Thank You Wednesday, May 24, 2017