3-JavaWebServices - PUC-Rio

Download Report

Transcript 3-JavaWebServices - PUC-Rio

Modulo II
WebServices
Prof. Ismael H F Santos
April 05
Prof. Ismael H. F. Santos - [email protected]
1
Bibliografia
April 05
Prof. Ismael H. F. Santos - [email protected]
2
Ementa
 WebServices em Java
April 05
Prof. Ismael H. F. Santos - [email protected]
3
SOA
WebServices
Java
April 05
Prof. Ismael H. F. Santos - [email protected]
4
WebServices com Java
 A plataforma J2EE oferece as seguintes APIs:
 Document-oriented


Java API for XML Processing (JAXP) processes XML documents
using various parsers
Java Architecture for XML Binding (JAXB) processes XML
documents using schema-derived JavaBeans component classes
 Procedure-oriented



April 05
Java API for XML-based RPC (JAX-RPC) sends SOAP method
calls to remote parties over the Internet and receives the results
Java API for XML Messaging (JAXM) sends SOAP messages
over the Internet in a standard way
Java API for XML Registries (JAXR) provides a standard way
toaccess business registries and share information
Prof. Ismael H. F. Santos - [email protected]
5
WebServices com Java
 A tecnologia Java oferece tambem as seguintes
ferramentas:


Java Web Services Developer Pack (Java WSDP)
SOAP with Attachments API for Java (SAAJ)
 Com estas APIs você não precisa saber como criar o
SOAP. Você só precisa saber utilizar as classes da API
para criar e acessar os Web Services.
April 05
Prof. Ismael H. F. Santos - [email protected]
6
State of the Art
April 05
UDDI
WSDL
SOAP
URI
HTML
HTTP
Prof. Ismael H. F. Santos - [email protected]
7
Web Service : How They Work?
SOAP Messages
Requestor
(http transport)
SOAP Client
Web Service Provider
Endpoint
 Components required




April 05
Software which needs to be exposed as a Web service
A SOAP Server (Apache Axis, SOAP::Lite, etc.)
HTTP Server (if HTTP is used as the transport level protocol)
SOAP Client (Apache Axis, SOAP::Lite etc.)
Prof. Ismael H. F. Santos - [email protected]
8
Simple Web Service Invocation
Service Requestor
Manual
Web Service
Lookup
2
3
HTTP GET
WSDL File
Remote
Web Service
Repository
(Web Sites)
1
Write
Client Code
Remote
Web service
4
SOAP Request
Invoke Web
Service
5
SOAP Response
Publish Web
Service
WSDL - Web Service Description
SOAP - Web Service Message Protocol
April 05
Prof. Ismael H. F. Santos - [email protected]
9
Web Service Description
 Why describe Web services?


A service requestor needs to analyze a service for
his requirements
A Web service needs to provide the following
information



the operations it supports
the transport and messaging protocols on which it supports those
operations
the network endpoint of the Web service
 Languages such as WSDL, DAML-S, RDF can be used for
describing Web services


WSDL – describes the syntactic information of a service
DAML-S and RDF – describe the syntactic as well as the semantic
information
From S. Chandrasekaran’s Talk
April 05
Prof. Ismael H. F. Santos - [email protected]
10
Web Service Description (WSDL)
Abstract
Description
Concrete
Description
April 05
Prof. Ismael H. F. Santos - [email protected]
11
SOA
WebService
Example
April 05
Prof. Ismael H. F. Santos - [email protected]
12
A Web Service example in Java
HTTP Server
Servlet engine (e.g. Apache Tomcat)
Any class
Any class
processing
Any class
processing
Any class
the incoming
processing
the incoming
processing
requests
the incoming
requests
the incoming
(“business
logic”
requests
(“business
logic”
requests
(“business logic”
(“business logic”
April 05
SOAP-aware
Servlet
(e.g. Apache Axis)
Prof. Ismael H. F. Santos - [email protected]
Sending
requests,
getting
results
13
Usual principles of Java toolkits
 Writing server is easier than writing clients (but only
regarding the toolkit, not the business logic)
 Servers may be written independently on the used toolkit
 Always test interoperability with a non-Java client
(because of data serialization and de-serialization)
 Steps:





write your service implementation
make all your classes available to the toolkit
deploy your service (usually done just once)
restart the whole servlet engine
test it with a client request
April 05
Prof. Ismael H. F. Santos - [email protected]
14
Java SOAP Toolkits
 Apache SOAP (was IBM’s SOAP4J)
 Apache Axis (a follow-on to the Apache SOAP)
 http://ws.apache.org/axis/
 …and many others
April 05
Prof. Ismael H. F. Santos - [email protected]
15
hello/HelloWorld.java
package hello;
public interface HelloWorld {
String getHelloMessage();
void setHelloMessage (String newHello);
}
hello/HelloWorldService.java
package hello;
public class HelloWorldService implements HelloWorld {
String message = "Hello, world!";
public String getHelloMessage() {
return message;
}
public void setHelloMessage (String newMessage) {
message = newMessage;
}
}
April 05
Prof. Ismael H. F. Santos - [email protected]
16
HelloWorldClient.java
import org.apache.axis.client.*;
public class HelloWorldClient {
public static void main (String [] args) {
try {
// prepare the call (the same for all called methods)
Call call = (Call) new Service().createCall();
call.setTargetEndpointAddress
(new java.net.URL(
"http://localhost:8080/axis/services/Hello"));
// call "get message"
if (args.length == 0) {
call.setOperationName ("getHelloMessage");
String result = (String)call.invoke( new Object[]{} );
System.out.println (result);
System.exit (0);
}
April 05
Prof. Ismael H. F. Santos - [email protected]
17
HelloWorldClient.java
// call "set message" and afterwards "get message"
call.setMaintainSession (true); // TRY also without
// this line...
call.setOperationName ("setHelloMessage");
call.invoke ( new Object [] { args[0] } );
call.setOperationName ("getHelloMessage");
System.out.println (call.invoke ( new Object [] {} ));
} catch (Exception e) {
System.err.println ("ERROR:\n" + e.toString());
}
}
}
April 05
Prof. Ismael H. F. Santos - [email protected]
18
Generated for HelloWorld
1. Make an instance of this
HelloWorldService
implements
2. Use it to make an instance of this
HelloWorldServiceLocator
getHello()
HelloWorld
3. Call methods on this proxy object
implements
HelloSoapBindingStub
April 05
Prof. Ismael H. F. Santos - [email protected]
19
HelloWorldClientFromStubs.java
public class HelloWorldClientFromStubs {
public static void main (String [] args) {
try {
// prepare the calls (the same for all called methods)
hello.generated.HelloWorldService service =
new hello.generated.HelloWorldServiceLocator();
hello.generated.HelloWorld myHelloProxy = service.getHello();
// call "get message"
if (args.length == 0) {
String result = myHelloProxy.getHelloMessage()
System.out.println (result);
System.exit (0);
}
// call "set message" and afterwards "get message”
myHelloProxy.setHelloMessage (args[0]);
System.out.println (myHelloProxy.getHelloMessage());
} catch (Exception e) {
System.err.println ("ERROR:\n" + e.toString());
}
}
}
April 05
Prof. Ismael H. F. Santos - [email protected]
20
Java <=> XML Data Mapping
 How Java objects are converted to/from XML data (in
order to be able to be put into SOAP messages)
 Important especially for the non-basic data types
 It’s easier if your non-basic data types are Java Beans
(having set/get methods for members)
April 05
Prof. Ismael H. F. Santos - [email protected]
21
Examples (Java Client)
URL endpointURL = new URL(endpoint);
Call call = new Call();
call.setSOAPTransport(m_httpconn);
call.setTargetObjectURI("MessageService");
call.setMethodName("setMessage");
call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
April 05
Prof. Ismael H. F. Santos - [email protected]
22
Examples (Java Client)
Vector params = new Vector();
params.addElement(
new Parameter("name", java.lang.String.class, name, null));
params.addElement(
new Parameter("colour", java.lang.String.class, colour,
null));
call.setParams(params);
Response response = call.invoke(endpointURL, "");
April 05
Prof. Ismael H. F. Santos - [email protected]
23
A Web Service example in Perl
#!/usr/bin/perl -w
-- Perl –
use SOAP::Transport::HTTP;
SOAP::Transport::HTTP::CGI
-> dispatch_to('HelloPerl')
-> handle;
This is a cgi-bin
script
package HelloPerl;
use strict;
This is a module implementing
use vars qw( $Message );
the “business logic”
$Message = 'Hello, here is Perl.';
sub getHelloMessage { $Message; }
sub setHelloMessage { $Message = shift; }
1;
#!/usr/bin/perl –w
use SOAP::Lite
on_fault => sub {…};
print SOAP::Lite
-> uri ('HelloPerl')
-> proxy ('http://localhost/cgi-bin/helloserver.cgi')
-> getHelloMessage
-> result;
April 05
Prof. Ismael H. F. Santos - [email protected]
This is a client
24
SOAP::Lite
 a collection of (many) modules

but they are loaded automatically when needed
 supports SOAP 1.1 specification
 all methods can be used for both setting and
retrieving values:


if you provide no parameters, you will get current value, and if
parameters are provided, a new value will be assigned to the
object
and the method in question will return the current object (if not
stated otherwise) which is is suitable for stacking these calls like:
$lite = SOAP::Lite
-> uri(’openBQS')
-> proxy('http://industry.ebi.ac.uk/soap/openBQS');
April 05
Prof. Ismael H. F. Santos - [email protected]
25
Using “wsdl” - directly
 getting “.wsdl” file by using its URL
 then, you do not need to worry about autotyping
#!/usr/bin/perl -w
use SOAP::Lite on_fault => sub {…};
print SOAP::Lite
-> service ('file:/home/senger/ws-ws/perl/Hello.wsdl')
-> setHelloMessage (123);
#!/usr/bin/perl -w
use SOAP::Lite on_fault => sub {…};
my $service = SOAP::Lite -> service ('file:./Hello.wsdl');
$service->setHelloMessage ($ARGV[0] or "Hello!!!");
print $service->getHelloMessage, "\n";
April 05
Prof. Ismael H. F. Santos - [email protected]
26