Transcript Document

Lecture 10:
Web Services
Outline
• Overview of Web Services
• Create a Web Service with Sun J2EE
(JAX-RPC)
What is a Web Service?
• A web service is a network accessible interface to
application programs, built using standard Internet
technologies.
• Clients of web services do NOT need to know
how it is implemented.
Application
client
Network
Web
Service
Application
program
Web Service Architecture
"server"
Service provider
bind
(SOAP)
publish
(WSDL)
Service broker
"naming service"
find
(UDDI)
Service requestor
"client"
Web Service Technology Stack
shopping web service?
Discovery
Web Service
Client
WSDL URIs
UDDI
publish WSDL URIs
Web Service
Description
WSDL
SOAP pkg request
Packaging
Proxy
SOAP pkg response
Transport
Network
Client Proxy = Stub, Server Proxy = Tie
Proxy
Step 1. Write Web Service Method
shopping web service?
Discovery
Web Service
Client
WSDL URIs
UDDI
publish WSDL URIs
Web Service
Description
WSDL
SOAP pkg request
Packaging
Proxy
SOAP pkg response
Transport
Network
Client Proxy = Stub, Server Proxy = Tie
Proxy
Step 2. Describe Web Service using WSDL
shopping web service?
Discovery
Web Service
Client
WSDL URIs
UDDI
publish WSDL URIs
Web Service
Description
WSDL
SOAP pkg request
Packaging
Proxy
SOAP pkg response
Transport
Network
WSDL can be automatically generated
Proxy
Step 3. Deploy Service at Server
shopping web service?
Discovery
Web Service
Client
WSDL URIs
UDDI
publish WSDL URIs
Web Service
Description
WSDL
SOAP pkg request
Packaging
Proxy
SOAP pkg response
Proxy
Transport
Network
Tie will be created, service location stored in WSDL
Step 4. Publish Service
shopping web service?
Discovery
Web Service
Client
WSDL URIs
UDDI
publish WSDL URIs
Web Service
Description
WSDL
SOAP pkg request
Packaging
Proxy
SOAP pkg response
Transport
Network
Client can locate the service querying UDDI
Proxy
Step 5. Generate Client Proxy
shopping web service?
Discovery
Web Service
Client
WSDL URIs
UDDI
publish WSDL URIs
Web Service
Description
WSDL
SOAP pkg request
Packaging
Proxy
SOAP pkg response
Proxy
Transport
Network
Stubs can be generated from WSDL automatically
Step 6. Write Client to Invoke Proxy
shopping web service?
Discovery
Web Service
Client
WSDL URIs
UDDI
publish
Web Service
Description
WSDL
SOAP pkg request
Packaging
Proxy
SOAP pkg response
Proxy
Transport
Network
Stubs can be generated from WSDL automatically
Step 7. Execute Client
shopping web service?
Discovery
Web Service
Client
WSDL URIs
UDDI
publish
Web Service
Description
WSDL
SOAP pkg request
Packaging
Proxy
Proxy
SOAP pkg response
Transport
Network
Client invokes service (almost) like a local method
JAX-RPC
• JAX-RPC = Java Web Services Architecture
• Sun's solution for writing Web Services and
Web Service clients
• Example: "HelloWorld" Service
Step 1. Write Web Service Method
shopping web service?
Discovery
Web Service
Client
WSDL URIs
UDDI
publish WSDL URIs
Web Service
Description
WSDL
SOAP pkg request
Packaging
Proxy
SOAP pkg response
Transport
Network
Client Proxy = Stub, Server Proxy = Tie
Proxy
Service Interface
package iis;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface HelloIF extends Remote
{
public String sayHello(String s)
throws RemoteException;
}
Web Service  Interface derived from class Remote
Methods required to throw RemoteException
Service Implementation
package iis;
public class HelloImpl
implements HelloIF
{
public String message ="Hello";
public String sayHello(String s)
throws RemoteException
{ return message + s; }
}
Compile the classes:
javac HelloIF.java HelloImpl.java
Step 2. Describe Web Service using WSDL
shopping web service?
Discovery
Web Service
Client
WSDL URIs
UDDI
publish WSDL URIs
Web Service
Description
WSDL
SOAP pkg request
Packaging
Proxy
SOAP pkg response
Transport
Network
WSDL can be automatically generated
Proxy
Configuration File
• All relevant information on Web Service
<?xml version="1.0" encoding="UTF-8"?>
<configuration
xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
<service
name="HelloWorldService"
targetNamespace="http://lsirwww.epfl.ch/"
typeNamespace="http://lsirwww.epfl.ch/"
packageName="iis">
<interface name="cis.HelloIF"/>
</service>
</configuration>
Generate WSDL
• Automatically derived from Interface and
Configuration File
wscompile -define -mapping build/mapping.xml
-d build -nd build -classpath build config.xml
• Deploytool will need information from
mapping.xml
Structure of WSDL
abstract
concrete
<?xml version="1.0">
<definitions name="HelloWorldService" … Name Space Information …>
<types>
<schema>
definition of parameter data types in XML Schema (optional)
</schema>
</types>
<message name="HelloIF_sayHello">
definition of a message (request, reply)
</message>
<portType name="HelloIF">
<operation name="sayHello">
definition of an operation (request – reply pair)
</operation>
</portType>
<binding name="HelloIfBinding" type="HelloIF">
definition of a protocol binding (typically SOAP)
</binding>
<service name="HelloWorldService">
<port name="StockQuotePort">
definition of a port (an Internet address)
</port>
</service>
</definitions>
Messages
<message name="HelloIF_sayHello">
<part name="String_1" type="xsd:string"/>
</message>
<message name="HelloIF_sayHelloResponse">
<part name="result" type="xsd:string"/>
</message>
Provides message names and passing of parameters
Ports
<portType name="HelloIF">
<operation name="sayHello" parameterOrder="String_1">
<input message="tns:HelloIF_sayHello"/>
<output message="tns:HelloIF_sayHelloResponse"/>
</operation>
</portType>
Define message sequences corresponding to a service invocation
Protocol Binding
<binding name="HelloIFBinding" type="tns:HelloIF">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/>
<operation name="sayHello">
<soap:operation soapAction=""/>
<input>
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
use="encoded" namespace="http://lsirwww.epfl.ch/"/></input>
<output>
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
use="encoded" namespace="http://lsirwww.epfl.ch/"/>
</output>
</operation>
</binding>
Implement abstract messages according to SOAP protocol
Sample Soap Message
<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://www.w3.org/2002/12/soap-envelope">
<env:Header>
<m:HelloIF_sayHello xmlns:m="http://lsirwww.epfl.ch/"
env:role="http://www.w3.org/2002/12/soap-envelope/role/next"
env:mustUnderstand="true">
</m:HelloIF_sayHello>
</env:Header>
<env:Body>
<p:String_1 xmlns:p="http://lsirwww.epfl.ch/">
Hello World!
</p:String_1>
</env:Body>
</env:Envelope>
Request message
SOAP client
SOAP server
Response message
Service Access
<service name="HelloWorldService">
<port name="HelloIFPort"
binding="HelloIFBinding">
<soap:address location="REPLACE_WITH_ACTUAL_URL"/>
</port>
</service>
Location not known before deployment
Step 3. Deploy Service at Server
shopping web service?
Discovery
Web Service
Client
WSDL URIs
UDDI
publish WSDL URIs
Web Service
Description
WSDL
SOAP pkg request
Packaging
Proxy
SOAP pkg response
Proxy
Transport
Network
Tie will be created, service location stored in WSDL
Deploy Service
• Web service tie is implemented as servlet
• Servlet is a Java application that can interact
with Web Server
(also JSPs are implemented as servlets!)
• Tie automatically generated at deployment
WAR file and Context Root
WAR file is archive collecting all needed files (like JAR)
Contect Root is location on Web Server
Provide WSDL File
As generated before
Provide Service Implementation
Note: WSDL does not know about the implementation!
Service Access
Note: Multiple Ports may have been provided in WSDL!
WSDL after Deployment
<service name="HelloWorldService">
<port name="HelloIFPort" binding="tns:HelloIFBinding">
<soap:address location=
"http://lsir-cis-pcx:8009/hello/helloService"/>
</port>
</service>
This can be published via UDDI
Step 4. Publish Service
shopping web service?
Discovery
Web Service
Client
WSDL URIs
UDDI
publish WSDL URIs
Web Service
Description
WSDL
SOAP pkg request
Packaging
Proxy
SOAP pkg response
Transport
Network
Client can locate the service querying UDDI
Proxy
UDDI
Step 5. Generate Client Proxy
shopping web service?
Discovery
Web Service
Client
WSDL URIs
UDDI
publish WSDL URIs
Web Service
Description
WSDL
SOAP pkg request
Packaging
Proxy
SOAP pkg response
Proxy
Transport
Network
Stubs can be generated from WSDL automatically
Generate Stubs
• Client Configuration File
<configuration
xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
<wsdl
location="build/HelloWorld.wsdl"
packageName="iis"/>
</configuration>
• Automatically created using WSDL and client
configuration file
wscompile -gen:client -d build -classpath build
config-client.xml
Step 6. Write Client to Invoke Proxy
shopping web service?
Discovery
Web Service
Client
WSDL URIs
UDDI
publish
Web Service
Description
WSDL
SOAP pkg request
Packaging
Proxy
SOAP pkg response
Proxy
Transport
Network
Stubs can be generated from WSDL automatically
Client Application
package iis;
import javax.xml.rpc.Stub;
public class HelloClient {
private String endpointAddress;
see next slide
public static void main(String[] args) {
try {
WS address
Stub stub = createProxy();
stub._setProperty
(javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY, args[0]);
HelloIF hello = (HelloIF)stub;
System.out.println(hello.sayHello(args[1]));
} catch (Exception ex) {
ex.printStackTrace();
}
}
parameter
Creating Proxy (Stub)
private static Stub createProxy()
{
return (Stub)
(new HelloWorldService_Impl().getHelloIFPort());
}
attaching _Impl to the service name is an
implementation-specific naming convention
Compiling and Packaging
compile
javac –classpath system_jars:server_class_files:
stub_class_files HelloClient.java
package
jar cvf hello-client.jar
all_client_class_files:all_server_class_files
Note: in the exercise the commands are
automated by using the asant scripting
utility provided by Sun J2EE
Step 7. Execute Client
shopping web service?
Discovery
Web Service
Client
WSDL URIs
UDDI
publish
Web Service
Description
WSDL
SOAP pkg request
Packaging
Proxy
Proxy
SOAP pkg response
Transport
Network
Client invokes service (almost) like a local method
Invoke Client
java –classpath hello-client.jar:jwsdp-jars
hello.HelloClient
"Hello World!"
Generated at Server – Displayed at Client