Title: Web Services with JAX-RPC and Apache Axis
1Web Services withJAX-RPC and Apache Axis
Sep. 18, 2002
- Pankaj Kumar (pankaj_kumar_at_hp.com),
- Software Architect,
- Web Services Management Organization,
- Hewlett Packard Co.
2Session 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.
3Speaker 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
4Outline 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
5Web Services Infrastructure
- Language and platform independent infrastructure
for loosely-coupled, inter-operable, app2app
communication over the Internet.
6Web Services (Contd.)
Language and platform independent gt separation
of specification and implementation Loosely
coupled gt message based, synchronous and
asynchronous interactions. Over the Internet
gt No centralized control, use of established
protocols, security considerations. Inter-operable
gt Standards based.
7Early (Internet) Technologies
- SMTP/MIME
- e-mail is still the killer app
- FTP, NNTP
- HTTP/HTTPS, HTML
- the protocol behind Internets popularity
Most of these facilitated app to human
interaction over the Internet/intranet
8Early (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.
9App2App 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, ...
10The 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.
11Additional 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
12SOAP In One Slide
SOAP1.1 Message Structure
- 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.
SOAP Envelope
Header Entries
Header Element
Body Element
Fault Element
13WSDL in One Slide
WSDL1.1 Document Structure
- 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
WSDL Document
Types
Messages
Port Types
Bindings
Services
14Java 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)
15SAAJ Object Model
16JAX-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
17JAX-RPC Physical Architecture
18Interoperability and JAX-RPC
19Apache 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)
20Install 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
docs
lib
webapps
samples
axis
WEB-INF
lib
classes
web.xml
21Test the Deployment
- Point your browser to http//localhost8080/axis
22A 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//localhost8080/axis/AddFunction.jws?wsdl
// File AddFunction.jws public class AddFunction
int addInt(int a, int b) return(ab)
Note All sources with instructions to run are
available at my web-site http//www.pankaj-k.net
23Writing 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
24AddFunctionClient 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//localhost8080/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 Objectnew Integer(5),
new Integer(6)) System.out.println("addInt
(5, 6) " ret) catch (Exception e)
System.err.println("Execution failed.
Exception " e)
25Compiling and Running the DII Client
26AddFunctionClient using Dynamic Proxy
// File lesson1\client\dproxy\AddFunctionClient.j
ava, 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//localhost808
0/axis/AddFunction.jws?wsdl" String
nameSpaceUri "http//localhost8080/axis/AddFunc
tion.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)
27Compiling and Running theDynamic Proxy Client
28AddFunctionClient using Generated Stubs
Generate the stubs java org.apache.axis.wsdl.WSDL
2Java \ http//localhost8080/axis/AddFunction.j
ws?wsdl
// File lesson1\client\stub\AddFunctionClient.jav
a, 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("Executio
n failed. Exception " e)
29Generating Stubs, Compiling and Running the Stub
Client
30Deployment Descriptors
- JWS deployment is simple, but has limitations
- You must have the source code
- Cant 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
31Adding 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//localhost8080/axis/services/AddFunction
1Service?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)
32The Deployment Descriptor
// File lesson2\service\deploy.wsdd ltdeployment
xmlns"http//xml.apache.org/axis/wsdd/"
xmlnsjava"http//xml.apache.org/axis/wsdd/pro
viders/java"gt lthandler name"print"
type"javaLogHandler"/gt ltservice
name"AddFunction1Service" provider"javaRPC"gt
ltrequestFlowgt lthandler type"print"/gt
lt/requestFlowgt ltparameter name"className"
value"AddFunction1"/gt ltparameter
name"allowedMethods" value""/gt ltbeanMapping
qname"myNSComplex" xmlnsmyNS"urnBeanService"
languageSpecificType"javaComplex"
/gt lt/servicegt lt/deploymentgt
Note (1) xmlnsjava (2) A handler in the
request path (3) Dispatch to RPC provider (4)
Bean type mapping
33Deploying the Service
34AddFunction1Client using Generated Stubs
Generate the stubs java org.apache.axis.wsdlWSDL2
Java \ http//localhost8080/axis/services/AddFu
nction1Service?wsdl
// File lesson2\client\stub\AddFunction1Client.ja
va, 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 AddFunction1ServiceL
ocator() AddFunction1 af
afs.getAddFunction1Service() Complex ret
af.addComplex(a, b) System.out.println("addCo
mplex(a b) (" ret.getR() ",
" ret.getI() ")")
Generated class
35Running the Client
36Additional (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
37Where to find more information?
- Apache Axis Home http//xml.apache.org/axis
- Suns Web Services Developer Pack Home
http//java.sun.com/webservices/webservicespack.ht
ml - W3Cs Web Services Activity Home Page
http//www.w3.org/2002/ws/ - My Home Page http//www.pankaj-k.net
38Thank You