Documentazione Contatti      
Documentazione > Tutorial > SOAP - Servizi Per La Chiamata Remota
Hide
Best Practices
EJB
Frameworks
Howto
J2EE
J2ME and Wireless
J2SE
JSP e Servlet
Java Application Server
Java IDE/Tools
Java Media
Java Security
Java Sys Admin
Java e XML
Java e SQL
OpenSource Java
Patterns
Repository
Tesi
UML
Web Services
Slide
White Paper di jws.it
project management
Eventi
Groovy



Oracle scippa Sun a IBM


Un giorno le macchine riusciranno...
a risolvere tutti i problemi, ma mai nessuna di esse potra' porne uno. Einstein


Introduzione a jrpc



  Visualizza Commenti (0) Aggiungi Commento    
 
SOAP - Servizi Per La Chiamata Remota
By Paolo Arcangeli
10 giugno 2005
Valutazione Acquisita: 60

  SOAP - Servizi Per La Chiamata Remota
Program SOAP pubblica dei Servizi?!?
Program COSA CI SERVE
Program L'installazione di Soap Su Tomcat 4.0.1
Program La Sicurezza su Soap
Program L'installazione di Soap Su Bea 6.1
Program L'installazione del client Soap
Program Lo Sviluppo di una Applicazione Di Servizio Soap (l'applicazione Server)
Program Lo Sviluppo dell' Applicazione Client
Program Il Test

Soap Simple Object Access Protocol (Semplice Protocollo di Accesso ad Oggetti) è un protocollo applicativo che permette di fare interagire componenti remoti basandosi sull'xml per la serializzazione dei dati e sul protocollo http per il trasporto dei dati.

In sostanza assolve al problema dello scambio di dati da inviare e ricevere tra sistemi interpiattaforma

Soap gestisce due tipi di messaggi CALL e RESPONSE.
Di fatto un messaggio di call permette di invocare un servizio remoto, mentre un messaggio di Response altro non è che il risultato proveniente dal servizio invocato.

Con Soap sono sufficienti poche righe di codice scritte in qualsiasi linguaggio di programmazione per costruire un'applicazione RPC (remote process call).

Soap si compone principalmente dei seguenti tre elementi:

  1. SOAP envelope; il framework che descrivere il contenuto del messaggio.
  2. SOAP encoding rules; definisce le regole di codifica per la rappresentazione dei tipi di dati definiti nell'applicazione.
  3. SOAP RPC Remote Procedure Call.


L'architettura, abbastanza semplice, è la seguente:


Fig. 1 SOAP - Servizi Per La Chiamata Remota

Esistono varie implementazioni di soap ed in questo articolo parleremo di Apache Soap2.2, open source disponibile sul sito http://xml.apache.org/dist/soap/.

Soap si compone di una Servlet e quindi, per cominciare, occorre deployare l'intera applicazione in un Servlet Engine.

Detta in forma elementare, sfrutteremo Soap per pubblicare dei servizi, dove per servizi intendiamo i metodi di comuni classi java che saranno configurate, su Soap, attraverso dei descrittori xml.



SOAP pubblica dei Servizi?!? top

Certo, ma è ovvio che le classi ed i relativi metodi per offrire questi servizi tocca a noi scriverli…ovviamente soap non fa tutto da solo
In conclusione:

Sul SERVER:
     Installo Soap
     pubblico il metodo che mi interessa esporre (Questo è il servizio).

Dal CLIENT:
     Il client invocherà tali servizi e sarà in grado di spedire o ricevere dati serializzati in xml.

Una classe è il contenitore dei servizi, ogni metodo , SE PUBBLICATO, diventa un servizio soap..
sarà sufficiente indicare a Soap la classe in cui tale metodo è contenuto.

Tutto chiaro fin qui?… procediamo per gradi…



COSA CI SERVE top
  • Collegatevi al sito di Apache e scaricate la versione Soap2.2

        Il file zip contiene:         

  1. soap.jar
  2. e api docs
  3. una applicazione web soap.war
  4. un pacchetto di esempi
  5. nche un breve manuale per l'uso
  •  Procuratevi anche:
  1.  xerces.jar
  2. activation.jar
  3. mail.jar


L'installazione di Soap Su Tomcat 4.0.1 top

a) Portate il file Soap.war sotto la directory di Tomcat webapps

b) Configurate l'applicazione aggiungendo al file ./conf/server.xml

<Context path="/soap" docBase="webapps/soap" crossContext="true"
debug="0" reloadable="true" trusted="false" />

c) Nel file startup.bat aggiungete questa riga prima dell'avviamento di "catalina"

set CLASSPATH=C:\miaPath\xerces.jar;%CLASSPATH%;

E' molto importante che xerces sia caricato in testa nel classpath per evitare che Tomcat usi il suo parser che è incompatibile con Soap.

d) Avviate il Server

Verificate che Tomcat abbia autodeployato l'applicazione web. Assumo per scontato che Tomcat sia in locale e che stiate usando la porta di default, quindi collegatevi al seguente url

http://localhost:8080/soap/admin

Se l'installazione è avvenuta correttamente vedrete sul Browser la console di amministrazione di Soap!



La Sicurezza su Soap top

Il sistema di Admin di Soap è raggiungile dall'esterno via Http.
Per inibirne l'accesso Occorre:

1. Su Tomcat è sufficiente aggiungere un ruolo nel File Tomcat-user.xml

<tomcat-users>
      <user name="tomcat" password="tomcat" roles="tomcat" />
      <user name="role1" password="tomcat" roles="role1" />
      <user name="both" password="tomcat" roles="tomcat,role1" />
      <user name="soap" password="soap" roles="soap" />
   </tomcat-users>

2. Su Bea, dalla console, crea un nuovo user ad es: user soap --password soap

vai in Security
    |
    |---Users
         |
         |---Create a New User

Sul file soap/WEB-INF/web.xml prima del tag di chiusura </web-app> aggiungi:

<!-- Authentication -->

   <security-constraint>
       <web-resource-collection>
       <web-resource-name>soap</web-resource-name>
            <url-pattern>/admin/*</url-pattern>
       </web-resource-collection>
       <auth-constraint>
             <role-name>soap</role-name>
       </auth-constraint>
       </security-constraint>
       <login-config>
             <auth-method>BASIC</auth-method>
       </login-config>
      <security-role>
             <role-name>soap</role-name>
      </security-role>

Questa configurazione permettrà l'accesso alla console di amministrazione Soap solo dopo essere stati autenticati come user Soap



L'installazione di Soap Su Bea 6.1 top

Andate nella directory: C:\bea\wlserver6.1\config\mydomain\applications

Create la subDirectory soap

Portate soap.war nella directory C:\bea\wlserver6.1\config\mydomain\applications\soap

Avviate la console di Bea
Cliccate su web-applications
Cliccate su Install a new Web Applications
Cliccate su sfoglia
Selezionate C:\bea\wlserver6.1\config\mydomain\applications\soap\soap.war

Cliccate su Upload

Se tutto funziona sotto il nodo WebApplication vi apparirà anche l'applicazione web: Soap

Collegatevi via browser su http://localhost:7001/soap/index.html

e… Se vedrete questa pagina:
 

Apache-SOAP

Hello! Welcome to Apache-SOAP.
What do you want to do today?

  • Run the admin client
  • Visit the SOAP RPC router URL for this SOAP server

FATTO ORA SOAP STA GIRANDO SU BEA !

VERIFICHE DA FARE:

Se aprite il file web.xml di Soap (c:\bea\wlserver6.0\config\mydomain\applications\soap\WEB-INF\web.xml)

verificate che ci sia il seguente init-param

<init-param>
   <param-name>ConfigFile</param-name>
   <param-value>c:\BEA\wlserver6.0\config\mydomain\applications\soap\soap.xml</param-value>
</init-param>


e quindi adesso configura il server su Soap.xml

c:\BEA\wlserver6.0\config\mydomain\applications\soap\soap.xml

<soapServer>
  <!-- This section defines the same thing you get if you don't -->
  <!-- specify anything at all - aka the default -->
  <configManager value="org.apache.soap.server.DefaultConfigManager" >
    <option name="filename"       value="c:\BEA\wlserver6.0\config\mydomain\applications\soap\DeployedServices.ds" />
  </configManager>
</soapServer>


Xerces.jar
E' molto importante che Xerces sia raggiungibile prima del parser che il vostro server userebbe normalmente, quindi inseritelo in testa nel classpath sia di Tomcat sia di Bea.



L'installazione del client Soap top
Inserite nel vostro ClassPath:
soap.jar
xerces.jar
activation.jar
mail.jar


Lo Sviluppo di una Applicazione Di Servizio Soap (l'applicazione Server) top

Non mi dilungo e vi faccio subito un esempio:

/**
* SOAP : Codice di esempio
* Autore: Paolo Arcangeli
* email : arcap@interfree.com
*/

package esempi.provaSaluti;

//import java.io.*;
//import java.util.*;


    public class CiaoServer
    {

        public String sayCiao(String say)
        {
                return ("Ciao "+say+" Siente appena entrati nel mondo di.... SOAP ");
        }
}

Cosa vedete di particolare in questa classe? Nulla? Infatti questa è una banalissima classe che ho chiamato CiaoServer e con un solo metodo che ho chiamato sayCiao().

… sayCiao() è il servizio che voglio pubblicare.

Il Deploy dell' Applicazione Di Servizio Soap
Create un nuovo File col nome che più vi paice .xml …io vi suggerisco CiaoServerDeploy.xml e aggiungete le seguenti rige:
<isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment" id="urn:CiaoServer">

<isd:provider type="java" scope="Request" methods="sayCiao">
<isd:java class="esempi.saluti.CiaoServer" static="false"/>
</isd:provider>

</isd:service>

id="urn:CiaoServer" Indica il nome del Servizio che Stiamo publicando
class="esempi.saluti.CiaoServer" Indica la Classe che rappresenta il nostro servizio
methods="sayCiao" Indica il metodo del nostro servizio che vogliamo publicare
Non abbiamo ancora finito: Ora dobbiamo deployare:

Su Tomcat eseguite dalla linea di comando:
java org.apache.soap.server.ServiceManagerClient http://localhost:8008/soap/servlet/rpcrouter deploy CiaoServerDeploy.xml

Su Bea eseguite dalla linea di comando:
java org.apache.soap.server.ServiceManagerClient http://localhost:7001/soap/servlet/rpcrouter deploy CiaoServerDeploy.xml



Lo Sviluppo dell' Applicazione Client top

Stavolta il codice merita qualche spiegazione in più:

/**
* SOAP : Codice di esempio
* Autore: Paolo Arcangeli
* email : arcap@interfree.com
*/

import java.net.*;
import java.util.*;

import org.apache.soap.util.xml.*;
import org.apache.soap.*;
import org.apache.soap.rpc.*;

public class Ciao
     {
         public final static void main(String args[]) throws MalformedURLException, SOAPException
         {
          Vector params = new Vector();
           params.addElement(new Parameter("Say", String.class, " Sono Io..mi Riconoscete? ", null));

           Call call = new Call();
           call.setTargetObjectURI("urn:CiaoServer"); //RIFERIMENTO ALL' isd:service
           call.setMethodName("sayCiao"); //IL METODO CHE VOGLIO INVOCARE
           call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);

           call.setParams(params); //IL VETTORE CONTIENE I PARAMETRI DA //PASSARE AL METODO              sayCiao

           URL url = new URL("http://localhost:8080/soap/servlet/rpcrouter"); //PASSO LA URL

            PER RAGGIUNGERE SOAP

            Response resp = call.invoke(url,""); //resp CONTERRA' L'ESITO DELLA CHIAMATA

            if(!resp.generatedFault())
            {
                Parameter ret = resp.getReturnValue();
                System.out.println(ret.getValue());
             }
             else
            {
            Fault fault = resp.getFault();
            System.err.println("--------------------------------");
            System.err.println("Attenzione: Condizione di Fault");
            System.err.println("Codice: "+ fault.getFaultCode());
            System.err.println("Descrizione: "+ fault.getFaultString());
            System.err.println("--------------------------------");
             }
        }
}



Il Test top

Dopo aver compilato javac Ciao.java
Lanciate java Ciao

Se Funzione leggerete:
Ciao! Siete appena entrati nel mondo di.... SOAP

Il Loggin dell' Applicazione Client

  • Dunque a questo punto abbiamo installato Soap sul Server (Tomcat o Bea)
  • Configurato un login Basic per il servizio di admin di Soap
  • Creato e Deployato un Servizio
  • Creato e Testato una Classe Client.

Manca ancora una cosa! L' autenticazione dell'applicazione client.

Così come ci siamo creati un ruolo di amministratore per Soap questa volta andremo a crearci un ruolo per gli utenti di soap: "soapUser"

Su Tomcat è sufficiente aggiungere un ruolo nel File Tomcat-user.xml

<tomcat-users>
    <user name="tomcat" password="tomcat" roles="tomcat" />
    <user name="role1" password="tomcat" roles="role1" />
    <user name="both" password="tomcat" roles="tomcat,role1" />
    <user name="soap" password="soap" roles="soap" />
    <user name="soapUser" password="soapUser" roles="soapUser" />
</tomcat-users>

b) Su Bea, dalla console, crea un nuovo user ad es: user soapUser --password soapUser

  vai in Security
      |
      |---Users
           |
           |---Create a New User

c) Sul file soap/WEB-INF/web.xml in <security-constraint> occorre aggiungere

<web-resource-collection>
          <web-resource-name>soapUser</web-resource-name>
          <url-pattern>/servlet/rpcrouter</url-pattern>
</web-resource-collection>
          <auth-constraint>
             <role-name>soapUser</role-name>
         </auth-constraint>

ed inoltre occorre ancora aggiungere il ruolo:

<security-role>
         <role-name>soapUser</role-name>
</security-role>


A questo punto la parte del file web.xml dedicata ai criteri di autenticazione dovrebbe essere la seguente:

<!-- Authentication -->

    <security-constraint>
         <web-resource-collection>
              <web-resource-name>soap</web-resource-name>
              <url-pattern>/admin/*</url-pattern>
         </web-resource-collection>
         <auth-constraint>
              <role-name>soap</role-name>
         </auth-constraint>
       <web-resource-collection>
            <web-resource-name>soapUser</web-resource-name>
       <url-pattern>/servlet/rpcrouter</url-pattern>
       </web-resource-collection>
       <auth-constraint>
            <role-name>soapUser</role-name>
       </auth-constraint>
   </security-constraint>

   <login-config>
          <auth-method>BASIC</auth-method>
   </login-config>

    <security-role>
        <role-name>soap</role-name>
    </security-role>
    <security-role>
        <role-name>soapUser</role-name>
    </security-role>


Questa configurazione permetterà l'accesso alla console solo all'amministratore di Soap, invece potranno accedere ai servizi di Soap solo gli utenti riconosciuti nel ruolo di soapUser

Adesso nell'applicazione client bisogna aggiungere alcune righe:

in import :
import org.apache.soap.transport.http.SOAPHTTPConnection;

prima del metodo invoke:

SOAPHTTPConnection conn = new SOAPHTTPConnection();
conn.setPassword("soap");
conn.setUserName("soap");
call.setSOAPTransport(conn);


Fatto compilate e provate…….Ciao e…. buon lavoro.






JavaPortal è ideato da:    
K-Tech Logo










LICENZA



Eccetto dove diversamente specificato, i contenuti di questo sito sono rilasciati sotto licenza Creative Commons

Sitemap  © 2002-2004 Copyright Information. Privacy . Today is sabato 19 giugno 2010