Download Web Services with JAX

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
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