Web Services – Part II
description
Transcript of Web Services – Part II
![Page 1: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/1.jpg)
1
Web Services – Part II
CS 236607, Winter 2007/8
![Page 2: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/2.jpg)
2
Axis : Apache EXtensible Interaction System
![Page 3: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/3.jpg)
3
What is AXIS? Axis is essentially a SOAP engine – a framework
for constructing SOAP processors client side server side
Axis implements the interfaces of JAX-RPC (XML-based remote procedure calls in Java)
It also includes: A simple stand-alone server A server which plugs into servlet engines such as Tomcat (A
Web Application) Extensive support for the Web Service Description Language
(WSDL) - e.g., tools for generating Java classes from WSDL and vice versa
And more…
![Page 4: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/4.jpg)
4
Remote Method Invocation is not New
java.rmi has been in Java since Java’s early versions In Java RMI, objects can invoke methods of objects that
reside on a remote computer (RMI = Remote Method Invocation)
So, what has been changed? Using HTTP for communication Using agreed protocols, Java can invoke methods that were not
written in Java (e.g., .NET methods) and vice versa A complex registry procedure has been required in RMI
![Page 5: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/5.jpg)
5
What We Would Like to Create Client applications: applications that can call a
remote Web service Services: methods that can be called by remote
applications Service descriptions: WSDL files that describe
our methods
![Page 6: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/6.jpg)
6
Client Applications
![Page 7: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/7.jpg)
7
Calling Web Services
By now, we already know how to invoke a remote Web service in Java: Open a socket to the remote server Through the socket, send a SOAP request wrapped by
a HTTP request Parse the response (e.g., using SAX/DOM)
However, this approach is cumbersome, and most of it can be automated This is the whole point of using standards…
![Page 8: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/8.jpg)
8
Invoking Services with Apache Axis includes tools for easily managing calls to
Web services The programmer configures the request for the
Web service using a friendly API with, or without considering the WSDL
According to the configuration, a method invocation is transformed into a SOAP request that is sent to the remote server
![Page 9: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/9.jpg)
9
Invoking Services with Axis
To invoke an operation of a Web service, do the following: Construct a Service instance Using the Service instance, generate a Call instance Configure the Call instance Invoke the call
Let’s see an example… (We will run some after the Server Application section)
![Page 10: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/10.jpg)
import org.apache.axis.client.*;import javax.xml.namespace.QName;import javax.xml.rpc.ParameterMode;import javax.xml.rpc.encoding.XMLType;
public class CurrencyExchange {
public static void main(String[] args) throws Exception { String endpointUrl = "http://services.xmethods.net:80/soap"; String nsuri = "urn:xmethods-CurrencyExchange";
Service service = new Service(); Call call = (Call) service.createCall();
Example: Currency Exchange (don’t try to run it)
![Page 11: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/11.jpg)
call.setTargetEndpointAddress(endpointUrl); call.setOperationName(new QName(nsuri,"getRate")); call.addParameter("country1", XMLType.SOAP_STRING, ParameterMode.IN); call.addParameter("country2", XMLType.SOAP_STRING, ParameterMode.IN);
call.setReturnType(XMLType.SOAP_FLOAT); Object ret = call.invoke(new Object[] {"Euro","Israel"});
System.out.println(ret); }}
Example: Currency Exchange (cont)
![Page 12: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/12.jpg)
12
Using the WSDL
Axis can read a given WSDL and configure the service as much as possible from that WSDL
Instead of using the default constructor, construct the service using the following constructor:Service(String wsdlLocation, QName serviceName)
In this approach, you usually need to know the following about the service: the WSDL URL, the service name, the namespace uri,
the operation name and the expected arguments
![Page 13: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/13.jpg)
public class CurrencyExchange2 { public static void main(String[] args) throws Exception { String wsdl = "http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl"; QName sName = new QName("http://www.xmethods.net/sd/CurrencyExchangeService.wsdl",
"CurrencyExchangeService"); String oName = "getRate";
Service service = new Service(wsdl, sName); QName port = (QName)service.getPorts().next(); Call call = (Call)service.createCall(port, oName);
System.out.println(call.invoke(new Object[] {"UK","Israel"}));}}
![Page 14: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/14.jpg)
14
WSDL Version
In the previous class we introduced WSDL version 2.0
Though there are services already doing use of this version, most of the web services you’ll visit us WSDL 1.0 (including the WSDL produced by Tomcat)
![Page 15: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/15.jpg)
15
Even Simpler Client
We will later see and run even a simpler client using WSDL2Java
![Page 16: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/16.jpg)
16
Server Applications
![Page 17: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/17.jpg)
17
Creating a Web Service
Next, we will see how we can create and publish a Web service using Axis in Tomcat
![Page 18: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/18.jpg)
18
AXIS Installation
Axis works inside a Servlet container (e.g., Tomcat)
You should add to your Tomcat libs some jar files: axis.jar, saaj.jar, wsdl4j.jar, …
You need to include several jar files in your CLASSPATH
The jar files should be placed under $CATALINA_BASE/lib/
![Page 19: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/19.jpg)
19
AXIS Installation (cont)
You need to copy the Axis application to your Tomcat's application directory:
$CATALINA_BASE
webapps lib
Myapp axis The place for the jar files
The directory that you need to copy
![Page 20: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/20.jpg)
20
1. Generate the Implementing Class
package myws;public class Power { public int power(int a, int n) { return (int)Math.pow(a,n); }}
$CATALINA_BASE/webapps/axis/WEB-INF/ classes/myws/Power.class
![Page 21: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/21.jpg)
2. Deploy the Service using Web Service Deployment Descriptor<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="mypower" provider="java:RPC"> <parameter name="className" value="myws.Power"/> <parameter name="scope" value=“application"/> <parameter name="allowedMethods" value="*"/> </service>
</deployment> services.wsddservices.wsdd
![Page 22: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/22.jpg)
22
Register the service
java –cp %AXISCLASSPATH% org.apache.axis.client.AdminClient -hlocalhost -p8080 services.wsdd
In Windows, this is how the classpath should be set: set AXIS_HOME=C:\236607\axis-1_4 set AXIS_LIB=%AXIS_HOME%\lib set AXISCLASSPATH =%AXIS_LIB%\axis.jar;%AXIS_LIB%\
commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar
![Page 23: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/23.jpg)
That's it! You Can Call the Service.import org.apache.axis.client.*;
public class PowerClient {
public static void main(String[] argv)throws Exception { String endpoint = "http://localhost:8080/axis/services/mypower"; Call call = (Call) new Service().createCall(); call.setTargetEndpointAddress(endpoint); call.setOperationName("power"); Object value = call.invoke(new Object[] {new Integer(2), new Integer(5)}); System.out.println(2+"^"+5 +"=" + value); }}
![Page 24: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/24.jpg)
24
How Does it Work?
The AXIS plugin is simply a Web application that resides in Tomcat (under webapps/)
The Servlet AxisServlet of this application is responsible for invoking services
All URLs of the form /services/* are mapped to the AxisServlet Where is that written?
![Page 25: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/25.jpg)
25
How Does it Work? (Cont.) The wsdd file defines mappings between Web-
service elements to Java-class elements i.e., names, methods, etc.
The class AdminClient sends a request to the application to register the service based on the wsdd content
When a SOAP request arrives, the AxisServlet object parses the request and invokes the corresponding method of the class associated with the service URL (According to the services that were deployed)
![Page 26: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/26.jpg)
26
The Deployment Descriptor
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="mypower" provider="java:RPC"> <parameter name="className" value="myws.Power"/> <parameter name="scope" value=“application"/> <parameter name="allowedMethods" value="*"/> </service>
</deployment> services.wsddservices.wsdd
![Page 27: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/27.jpg)
27
The Scope of the Object
Request (the default): a new object is created for each request, the service instance is available for the duration of the request
Session: a new object is created for each new session and the service instance is available for the entire session
Application: a singleton shared service instance is used to serve all invocations
![Page 28: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/28.jpg)
28
Undeploying a Service
<undeployment xmlns="http://xml.apache.org/axis/wsdd/"> <service name="mypower"/></undeployment>
Java –cp %AXISCLASSPATH% org.apache.axis.client.AdminClient -hlocalhost -p8080 undeploy.wsdd
undeploy.wsddundeploy.wsdd
![Page 29: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/29.jpg)
29
Implementing Classes
The class that implements the Web service must be accessible to the Axis Servlet
Hence, this class should reside in a package under $CATALINA_BASE/webapps/axis/WEB-INF/classes
Of course, all helper classes should be accessible to the Axis application too
![Page 30: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/30.jpg)
30
The Service WSDL
Axis automatically provides a WSDL for each deployed service
To get the WSDL, use the service URL with the empty argument wsdl
http://localhost:8080/axis/services/mypower?wsdl
![Page 31: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/31.jpg)
31
JWS Files
There is a fast and easy way of creating a service:1. Create a Java class myClass.java
2. Rename your class to end with jws: myClass.jws
3. Put the jws file directly under the directory $CATALINA_BASE/webapps/axis/ (the application’s root)
4. That is all. Now you can call the service!
![Page 32: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/32.jpg)
32
Example: a Calculator Service
public class SimpleCalculator {
public int add(int i1, int i2) { return i1 + i2; } public int subtract(int i1, int i2) { return i1 - i2; }}
$CATALINA_BASE/webapps/axis/SimpleCalculator.jws
Service URL:http://server:port/axis/SimpleCalculator.jws
![Page 33: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/33.jpg)
33
Example: a Calculator Service
public class CalculatorClient { public static void main(String[] argv)throws Exception { String endpoint = "http://localhost:8080/axis/SimpleCalculator.jws"; Call call = (Call) new Service().createCall(); call.setTargetEndpointAddress(endpoint); call.setOperationName("add"); Object value = call.invoke(new Object[] {new Integer(4), new Integer(6)}); System.out.println(value); }}
![Page 34: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/34.jpg)
34
How does it Work?
On the first time the jws file is being called, it is compiled into a class WEB-INF/jwsClasses/SimpleCalculator.class
Axis then considers the URL of the jws as one of a regular web service Default configurations are assumed
Sounds like any other technology we know?
![Page 35: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/35.jpg)
35
When not to Use jws Files
When you do not have the Java source code When you don’t want to expose your code When you want to use other configuration options
![Page 36: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/36.jpg)
36
Even Easier Client
WSDL2Java
![Page 37: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/37.jpg)
37
The WSDL2Java Application
Axis provides a mechanism for communicating with a Web service using stubs
That is, generation of regular Java classes that have an interface similar to that of the Web service and implementation that wraps Web service management
Invoke class WSDL2Java in order to create the required Java classes
![Page 38: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/38.jpg)
38
Generated Classes
WSDL2Java generates the following: A service interface and a service
implementation (locator) for each service A stub class for each binding (WSDL bindings defines the
message format and protocol details for a web service )
An interface for each port type (“interface” in WSDL 2.0 – operation with it’s input and output)
This interface contains methods that correspond to the operations of the port type
A class for each complex type
![Page 39: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/39.jpg)
An Example
![Page 40: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/40.jpg)
40
Using The Generated Classesimport localhost.axis.services.mypower.*;
public class SimplerPowerClient {
public static void main(String[] args) throws Exception {
Power p = new PowerServiceLocator().getmypower();
System.out.println("2^5 = " + p.power(2, 5)); }}
![Page 41: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/41.jpg)
41
A Real Example
Let’s see how does it work with a real web service for currency exchange.
We’ll look at ServiceObjects web service for exchanging currency rates.
As you can see they supply many other services and you can try most of them for free.
The WSDL of the service is located here. Let’s see how it works…
![Page 42: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/42.jpg)
42
A Little More… Axis Type Mappings
Axis uses mappings between SOAP types and Java classes and primitive types. More can be found here.
Exception Handling Several problems can cause exception to be thrown when a
service is being invoked: the request is inappropriate (no such operation, invalid arguments,
etc.) the implementing service method has thrown an exception
When the implementing service throws an exception, a SOAP fault response is returned by the server
The client invocation method translates this response to a java.rmi.RemoteException after parsing the response
![Page 43: Web Services – Part II](https://reader035.fdocuments.us/reader035/viewer/2022062518/5681493d550346895db68a45/html5/thumbnails/43.jpg)
43
Resources
AXIS Home AXIS API A friendly download from the course site. Getting Started Guide HU