środa, 22 września 2010

Web Services – usługa i klient z wykorzystaniem Apache Axis 2 i Eclipse Galileo

Mój zbliżający się wielkimi krokami projekt oparty będzie o usługi sieciowe w związku z czym, postanowiłem rozpoznać temat i zobaczyć jakie jest wsparcie w Eclipse i co sprawdzi się lepiej – Apache Axis 2 czy JAX-WS (Java API for XML Web Services). Zacznijmy od Axisa – nie wymaga in kontenera EJB w związku z czym użyłem Tomcata 6.
W Eclipse wybieramy File → New → Dynamic Web Project
Do utworzenia mojego Web Service'u wybrałem podejście bottom-up czyli utworzenie usługi z klasy Java. Alternatywnie można wybrać podejście top-down czyli utworzenie usługi na bazie istniejącego dokumentu WSDL.
Poniżej moja klasa z jedną metodą
public class AxisDemoService {
 
 public String sayHello(String name){
  return "Hello "+name;
 } 
}

Następnie wybieramy File –> New → Web Service
W następnym kroku należy wybrać funkcje dostępne dla naszej usługi
 
i wystartować server
To czy usługa została poprawnie uruchomiona można sprawdzić pod adresem: http://localhost:8080/AxisWS/services
Czas na utworzenie aplikacji klienckiej. Ja zrobię to w osobnym projekcie o nazwie AxisWSClient.
Ponownie wybieramy File → New → Dynamic Web Project , a następnie File –> New → Web Service Client. Wskazujemy na lokalizację naszego dokumentu WSDL:
Poniżej wygenerowany z automatu kod mojej aplikacji klienckiej.
 
Czas na mały test. Utworzyłem w tym celu dodatkową klasę
import java.rmi.RemoteException;

public class AxisDemoServiceTest {

    public static void main(String[] args) throws RemoteException {
        
        AxisDemoServiceProxy proxy = new AxisDemoServiceProxy();
        proxy.setEndpoint("http://localhost:8080/AxisWS/services/AxisDemoService?wsdl");
        
        String message = proxy.sayHello("Kuba");
        System.out.println(message);

    }
} 

Warto jeszcze zabezpieczyć usługę. W tym celu wykorzystałem najprostszą z możliwych autentykację typu BASIC. W pliku konfiguracyjnym tomcat-users.xml dodałem użytkownika

  
  


i stworzyłem odpowiednie wpisy w pliku web.xml

   
    Axis Services
    /services/*
   
   
    ws_role
   
  
  
   BASIC
   Axis WS Realm
  

Moja klasa testowa w aplikacji klienckiej także wymagała małej modyfikacji
public class AxisDemoServiceTest {

 public static void main(String[] args) throws RemoteException {
  
  AxisDemoServiceProxy proxy = new AxisDemoServiceProxy();
  proxy.setEndpoint("http://localhost:8080/AxisWS/services/AxisDemoService?wsdl");
  
  AxisDemoServiceSoapBindingStub stub = (AxisDemoServiceSoapBindingStub)proxy.getAxisDemoService();
        stub.setUsername("ws_user");
        stub.setPassword("ws_password");
  
  String message = proxy.sayHello("Kuba");
  System.out.println(message);

 }
}

Działa.

1 komentarz:

  1. Dobre, krotko i na temat. Moze oceniam to z niewlasciwej perspektywy bo temat juz znam, ale sade, ze dla nowicjuszy to moze byc doskonaly zaczatek do poznania wiedzy dotyczacej WebService, a jesli chca wiedziec wiecej to niech drenuja net w poszukiwaniu, to jest najlepsza forma nauki - praktyka + eksperymenty + poszukiwania.

    OdpowiedzUsuń