poniedziałek, 19 lipca 2010

Grails jako klient usługi sieciowej

W tym przykładzie pokażę jak można szybko i z łatwością stworzyć w Grails klienta usługi sieciowej dla LINK, bazując na informacjach i kodzie udostępnionych w LINK. Interfejs użytkownika będzie w całości wygenerowany przez mechanizm rusztowania(ang. Scaffolding), minimalnie tylko zostanie zmodyfikowany jeden z widoków i strona główna.

Teraz trochę o samej usłudze sieciowej, jest to prosta wyszukiwarka cytatów z dzieł Shakespeara. Należy podać część cytatu jaki chcemy odnaleźć, a wyszukiwarka zwraca nam tytuł sztuki, mówce i pełną frazę odpowiadającą szukanemu fragmentowi.

1. Tworzenie projektu i instalacja biblioteki GroovyWS

Tutaj znowu mamy pewną dowolność, możemy naszą aplikację Grailsową stworzyć w Netbeans IDE, czy też podając odpowiednią komendę w konsoli, tak czy inaczej zostanie wykonany skrypt napisany w języku Groovy, który inicjujemy poleceniem:
> grails create-app ShakesQuoteFinder
Do projektu potrzebujemy biblioteki GroovyWS, która umożliwi nam połączenie z usługą sieciową. Informacje na temat tej biblioteki możemy znaleźć w LINK, bezpośredni link do pobrania LINK.

Mamy przygotowany projekt do dalszej pracy, możemy teraz stworzyć klienta usługi bazującego na protokole SOAP.

2. Modyfikacja i dodanie kodu

Tworzymy dziedzinę problemu, klasę domenową, której atrybuty odpowiadać będą parametrom przesyłanym do i odbieranym od usługi zamieszczonej w internecie. W klasę domenową o nazwie ShakesQuote(grails create-domain-class ShakesQuote) wklejamy kod:
class ShakesQuote {
    String phrase

    String play
    String speaker
    String words

    static constraints = {
        phrase(nullable:true)

        play(nullable:true)
        speaker(nullable:true)
        words(nullable:true)
    } 
} 

Dalej, budujemy prostą usługę(zawierającą logikę biznesową) poprzez którą będziemy komunikować się z usługą WSShakespeare(do której link podałem na początku notki). Plik ShakesService(grails create-service Shakes) nadpisujemy kodem:
import groovyx.net.ws.WSClient

class ShakesService {
    boolean transactional = false

    def findQuote(params){
        def proxy = new WSClient("http://www.xmlme.com/WSShakespeare.asmx?WSDL",
            this.class.classLoader)
        proxy.initialize()

        def speech = new XmlParser().parseText(proxy.GetSpeech(params.phrase))

        params.play = speech.PLAY.text()
        params.speaker = speech.SPEAKER.text()
        params.words = speech.text()

        return params
    }
}
Teraz pozostało już tylko wygenerować kontroler i widoki(grails generate-all ShakesQuote) oraz zmodyfikować nieznacznie kod tak aby wykorzystać stworzoną usługę w wygenerowanym kontrolerze i lekko poprawić wygląd stworzonej aplikacji.

Przechodzimy do ShakesQuoteController.groovy i dopisujemy dwie linijki kodu:
def ShakesService //umieszczamy swobodnie(nie w metodzie ani domknięciu) w dowolnym 
                  //miejscu, ta linijka pozwoli na dynamiczne stworzenie instancji
                  //usługi ShakesService

def save = {
        ShakesService.findQuote(params); //drugą linijkę wklejamy w domknięciu
        ...                              //odpowiadającym za zapis naszych danych
        ...
} 
Tak naprawdę w tym momencie mamy już gotowy, działający projekt, możemy przetestować jego działanie. Jednak chcę upiększyć nieznacznie stronę główną, w której domyślnie wyświetlane jest menu zawierające status aplikacji, zainstalowane pluginy i tekst powitalny, a żadne z tych rzeczy na tą chwilę nam nie są potrzebne.

Zmiany w pliku index.gsp, który znajduje się w katalogu \Views and Layouts\ zamieszczam w tym miejscu LINK. Myślę, że nie trzeba tłumaczyć, w których miejscach kod został zmieniony, można nadmienić cały kod, albo porównać wygenerowaną domyślną stronę z tą zmodyfikowaną. Zamieszczam dwa zrzuty ekranu prezentujące zmiany.

Przed:
Po:
Kolejna modyfikacja, tym razem w \Views and Layouts\shakesQuote\, czyli w katalogu, w którym znajdują się wygenerowane wcześniej widoki dla naszej klasy dziedzinowej ShakesQuote. Otwieramy plik Create.gsp. Kod zmieniamy tak, aby widok wyświetlał nam tylko pole tekstowe Phrase, ponieważ na wstępie podajemy część cytatu, po którym chcemy szukać, a pozostałe parametry(play, speaker, words) pobierane są z usługi sieciowej WSShakespeare. Pozbywamy się więc trzech wierszy(<tr>) tabeli odpowiadających za trzy niepotrzebne parametry.

Przed:
Po:
3. Podsumowanie i efekt końcowy
Klient usługi sieciowej gotowy, dzięki Grailsowi bez jakiegokolwiek wysiłku mamy dostęp do funkcjonalności CRUD(create-read-update-delete) oraz możliwość zapisania wyszukanych informacji w bazie danych. Myślę, że przykład pokazał możliwości jakie daje Grails, podobnie postępując możemy stworzyć interfejs użytkownika dla dowolnej usługi sieciowej. Zainteresowanych dalszą adaptacją usług sieciowych w Grails, odsyłam do serii dwóch artykułów LINK1, LINK2, których końcowym efektem jest aplikacja planująca podróż, zaznaczająca na mapie poszukiwane lotniska.

Brak komentarzy:

Prześlij komentarz