You are on page 1of 38

Web Services with JAX-RPC and Apache Axis

Sep. 18, 2002

Pankaj Kumar (pankaj_kumar@hp.com), 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, December 3, 2008

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

Wednesday, December 3, 2008

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, December 3, 2008

Web Services Infrastructure

Language and platform independent infrastructure for loosely-coupled, interoperable, app2app communication over the Internet.

Wednesday, December 3, 2008

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, December 3, 2008

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, December 3, 2008

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, December 3, 2008

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, December 3, 2008

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, December 3, 2008

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, December 3, 2008

SOAP In One Slide
• XML based protocol for exchange of information
– Encoding rules for datatype instances – Convention for representing RPC invocations SOAP1.1 Message Structure
SOAP Envelope Header Entries

• Designed for looselycoupled distributed computing
– No remote references

[Header Element] Body Element

• Used with XML Schema • Transport independent • SOAP with Attachments allow arbitrary data to be packaged.

[Fault Element]

Wednesday, December 3, 2008

WSDL in One Slide
• A WSDL document describes
– What the service can do – Where it resides – How to invoke it WSDL1.1 Document Structure
WSDL Document [Types] {Messages}

• 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

{Port Types} {Bindings} {Services}

Wednesday, December 3, 2008

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, December 3, 2008

SAAJ Object Model
SOAPPart SOAPMessage AttachmentPart

Node SOAPFault SOAPElement SOAPFaultElement SOAPBody *SOAPBodyElement SOAPHeader SOAPHeaderElement * *

SOAPEnvelope
Wednesday, December 3, 2008

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, December 3, 2008

JAX-RPC Physical Architecture
WSDL description Service Client Stub
WSDL<->Java Mapping

Service Endpoint Container
Dispatch

JAX-RPC API Client Side JAX-RPC Runtime System

JAX-RPC API Server Side JAX-RPC Runtime System

Protocol (SOAP) Transport

Wednesday, December 3, 2008

Interoperability and JAX-RPC
WSDL description

Client JAX-RPC impl. <Vendor A>

Service Vendor prod. <Vendor C>

Client Vendor prod. <Vendor B>

Service J2EE Container <Vendor D>

WSDL description

Wednesday, December 3, 2008

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, December 3, 2008

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
Direcotry Structure:
axis-1_0

• 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.

webapps axis WEB-INF lib

lib

docs

samples

classes web.xml ……
Wednesday, December 3, 2008

Test the Deployment
• Point your browser to http://localhost:8080/axis

Wednesday, December 3, 2008

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.

// File: AddFunction.jws public class AddFunction { int addInt(int a, int b){ return(a+b); } }

Note: All sources with instructions •Examine its WSDL to run are available at my web-site: description. Point your http://www.pankaj-k.net browser to http://localhost:8080/axis/AddFunction.jws?wsdl
Wednesday, December 3, 2008

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, December 3, 2008

// 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, December 3, 2008

AddFunctionClient – using DII

Compiling and Running the DII Client

Wednesday, December 3, 2008

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, December 3, 2008

Compiling and Running the Dynamic Proxy Client

Wednesday, December 3, 2008

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, December 3, 2008

Generating Stubs, Compiling and Running the Stub Client

Wednesday, December 3, 2008

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, December 3, 2008

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.
// File: Complex.java public class Complex { public Complex(){} public double getR(){ … } public void setR(double r){ … } … public Complex add(Complex c){ … }

•Examine its WSDL description. Point your browser to http://localhost:8080/axis/services/AddFunction1Service?wsdl
Wednesday, December 3, 2008

// 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

Wednesday, December 3, 2008

Deploying the Service

Wednesday, December 3, 2008

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, December 3, 2008

Running the Client

Wednesday, December 3, 2008

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, December 3, 2008

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.ht • W3C’s Web Services Activity Home Page: http://www.w3.org/2002/ws/ • My Home Page: http://www.pankaj-k.net

Wednesday, December 3, 2008

Thank You
Wednesday, December 3, 2008