Ce este un web service
Este un lucru foarte normal ca dou programe (procese) sa comunice intre ele pe acceasi masina, folosind fisiere, IPC-uri, pipe-uri, cozi de mesaje, memorie partajata etc. Acest lucru se poate generaliza si la nivel de mai multe masini, adica aceleasi doua programe pot exista pe masini diferite, unul server iar celalalt client, metoda de comunica fiind socketii.
Un exemplu foarte la indemana este un client (un browser Firefox) si un server ruland Apache, comunicand la nivel HTTP, dar de multe ori se doreste ca serverul sa faca lucruri ceva mai complicate decat sa trimita clientului o pagina html, cum ar fi sa execute niste calcule foarte complexe si sa transmita rezultatul clientului. Acest lucru s-ar putea face in nenumarate feluri. O modalitate ar fi sa copii (scp) un script care face calculele, sa te conectezi apoi pe server si sa executi scriptul (ssh), apoi sa preiei rezultatele, dar aceasta metoda este destul de obositoare, mai ales cand trebuie sa repeti operatiunea. Web Services vin in ajutorul nostru, facand toate aceste lucruri intr-un mod unitar, generic si standardizat, toate pe baza paradigmei client-server.
Cum functioneaza un web service
Diagrama :
+--------------------------------------+| web service registry |
| (aka service broker) |
| (UDDI) |
+--------------------------------------+^ ^
| |
(2) | (1) |
| (the client | (the web service
WSDL finds the WSDL provider publishes
| service | the web service)
| they want) |
| |
v |
+-----------+ +-----------+
| service |<---SOAP--->| service |
| requestor | | provider |
+-----------+ (3) +-----------+
WSDL -- Web Services description Language - descrie prin XML ce face un web service
UDDI -- Universal Description, Discovery and Integration protocol - protocolul care publica wsdl-urile
SOAP -- protocol de transport mesaje XML folosind HTTP (peste TCP, folosind portul 80)
Ca sa descrii ce anume face web service-ul tau, ar trebui facut un fisier WSDL cu XML, dar acest lucru nu mai este necesar cand folosesti Axis, acesta creeza automat fisierul pentru tine, pe baza codului java.
Ce este Apache Axis
De Axis si de un server de aplicatii Tomcat. Axis se poate downloada de la http://people.apache.org/dist/axis/nightly/axis-bin-1_4.zip
Instalarea acestuia e foarte simpla. Se dezarhiveaza si se copie tot folderul webapps/axis in folderul webapps din Tomcat. Daca nu apar probleme, un apel catre http://localhost:8080/axis/ ar trebui sa incarce pagina cu Apache-AXIS.
Tot din folderul dezarhivat de Axis (in lib), pentru scrierea clientului, sunt necesare cateva biblioteci (jar-uri) . Eu am folosit doar axis.jar, commons-discovery-0.2.jar, commons-logging-1.0.4.jar, jaxrpc.jar si wsdl4j-1.5.1.jar.
Serverul arata cam asa:
public class Server {
public String echo(String str) {
return str;
}
public int add(int a, int b) {
return a+b;
}
public int substract(int a, int b) {
return a-b;
}
}
Acesta e initial un fisier Server.java care il copiem in directorul webapps/axis din Tomcat, schimbandui extensia din .java in .jws, deci vom avea webapps/axis/Server.jws
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import javax.xml.rpc.ParameterMode;
public class Client {
public static void main(String [] args) throws Exception {
String endpoint = "http://localhost:8080/axis/Server.jws";
String str = "echo string";
Integer a = new Integer(2);
Integer b = new Integer(7);
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));
String method = "echo";
call.setOperationName(method);
call.addParameter("unstring", XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType(XMLType.XSD_STRING);
String retstr = (String) call.invoke(new Object [] {str});
System.out.println("am trimis " + str + ", am primit " + retstr);
call.clearOperation();
method = "add";
call.setOperationName(method);
call.addParameter("unint", XMLType.XSD_INT, ParameterMode.IN);
call.addParameter("altint", XMLType.XSD_INT, ParameterMode.IN);
call.setReturnType(XMLType.XSD_INT);
Integer retint = (Integer) call.invoke(new Object [] {a, b});
System.out.println("am trimis " + a + " + " + b + ", am primit " + retint);
call.clearOperation();
method = "substract";
call.setOperationName(method);
call.addParameter("unint", XMLType.XSD_INT, ParameterMode.IN);
call.addParameter("altint", XMLType.XSD_INT, ParameterMode.IN);
call.setReturnType(XMLType.XSD_INT);
retint = (Integer) call.invoke(new Object [] {a, b});
System.out.println("am trimis " + a + " - " + b + ", am primit " + retint);
}
}
Ideea pe care s-a construit clientul e ca s-a pornit de la crearea a doua obiecte, un Service si un Call bazat pe Service. Aceste doua obiecte retin metadata despre web service. Apoi s-a setat endpointul pentru call (URL destinatie pentru mesajul SOAP), s-a setat operatia care se doreste apelata pe server, tipul parametrilor pentru operatie si se invoca operatia cu parametru un vector de obiecte ce reprezinta parametrii metodei invocate, iar ce anume returneaza metoda invoke pe call reprezinta chiar rezultatul operatiei apelate pe server.
No comments:
Post a Comment