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.
Saturday, October
03, 2015
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
Saturday, October
03, 2015
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
Saturday, October
03, 2015
Web Services Infrastructure
Language and platform independent infrastructure for
loosely-coupled, inter-operable, app2app
communication over the Internet.
Saturday, October
03, 2015
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.
Saturday, October
03, 2015
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
Saturday, October
03, 2015
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.
Saturday, October
03, 2015
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, ...
Saturday, October
03, 2015
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.
Saturday, October
03, 2015
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
Saturday, October
03, 2015
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]
Saturday, October
03, 2015
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}
Saturday, October
03, 2015
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)
Saturday, October
03, 2015
SAAJ Object Model
SOAPPart
SOAPMessage
AttachmentPart
Node
SOAPFault
SOAPElement
SOAPFaultElement
SOAPBody
SOAPHeader
* SOAPBodyElement
SOAPHeaderElement *
SOAPEnvelope
Saturday, October
03, 2015
*
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
Saturday, October
03, 2015
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
Saturday, October
03, 2015
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
Saturday, October
03, 2015
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)
Saturday, October
03, 2015
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
……
Saturday, October
03, 2015
Test the Deployment
• Point your browser to http://localhost:8080/axis
Saturday, October
03, 2015
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
Saturday, October
03, 2015
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
Saturday, October
03, 2015
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);
}
}
}
Saturday, October
03, 2015
Compiling and Running the
DII Client
Saturday, October
03, 2015
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);
}
}
Saturday, October
}
03, 2015
Compiling and Running the
Dynamic Proxy Client
Saturday, October
03, 2015
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);
}
}
}
Saturday, October
03, 2015
Generating Stubs, Compiling
and Running the Stub Client
Saturday, October
03, 2015
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
…
Saturday, October
03, 2015
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);
}
}
Saturday, October
03, 2015
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
Saturday, October
03, 2015
Deploying the Service
Saturday, October
03, 2015
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
Saturday, October
03, 2015
Running the Client
Saturday, October
03, 2015
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
…
Saturday, October
03, 2015
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
Saturday, October
03, 2015
Thank
You
Saturday, October
03, 2015
Descargar

Web Services with JAX