Programowanie w języku Delphi » Artykuły

Internetowe zastosowania Delphi cz. 1

Internetowe zastosowania Delphi cz. 1


UWAGA: Zestawienia danych i cech są prawidłowe dla Delphi 4.


Artykuł powstał na podstawie rozdziału 30. ksiażki "Delphi 4. Vademecum profesjonalisty" (tom II) wydawnictwa Helion.

Jak zapewne wiesz, Internet jest już praktycznie wszędzie. Coraz więcej aplikacji, a także elementów systemów operacyjnych ma związek z Internetem. Delphi oferuje szeroką gamę mechanizmów wspomagających tworzenie aplikacji internetowych. Można je podzielić na 3 kategorie:
  • obsługa protokołu HTTP (HyperText Transfer Protocol) w ramach łatwo obsługiwanych obiektów,
  • funkcje API umożliwiające aplikacjom dostęp do popularnych serwerów WWW,
  • wspomaganie tworzenia rozszerzeń serwera WWW.
Podstawową ideą Internetu jest dwustronna komunikacja pomiędzy żądającym usługi klientem a udostępniającym ją [tę usługę] serwerem. Komunikacja ta odbywa się w oparciu o pewien uzgodniony protokół. Jest nim HTTP, w ramach którego wymieniania między serwerem a klientem informacja ma postać strumieni znaków kodu ASCII zapisanych w postaci języka HTML (HyperText Markup Language). Tak oto może wyglądać przykładowe żądanie ze strony klienta (kod pochodzi z książki Delphi 4. Vademecum profesjonalisty. Tom II, wyd. Helion, 1999):

GET /mysite/webapp.dll/dataquery?name=CharleTuna&Company=Borland HTTP 1.0 Connection: Keep-Alive User-Agent: Mozilla/3.0b4Gold (WinNT; I) Host: www.mysite.com:1024 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*


Protokół HTTP jest protokołem bezstanowym, w związku z czym poszczególne żądania klienta obsługiwane są w sposób niezależny - nie istnieje wewnętrzny proces-klient, który mógłby stanowić "łącznik" pomiędzy poszczególnymi żądaniami. Utrudnia to bardzo konstrukcję aplikacji - np. poruszanie się po kolejnych rekordach bazy danych, wymagałoby informacji o numerze bieżącego rekordu. Istnieje jednak rozwiązanie zastępcze, stwarzające namiastkę stanu wewnętrznego. Są to tzw. ciasteczka (ang. cookies). Zajmiemy się nimi w dalszej części artykułu.

CGI, ISAPI i NSAPI


Funkcjonalność pierwszych serwerów WWW ograniczała się tylko do udostępniania gotowych stron HTML. Pierwsze podejście do dynamicznego tworzenia stron HTML to specyfikacja CGI (Common Gateway Interface). Zgodnie z nią, realizacją żądania klienta odbywa się w ramach odrębnego procesu. Umożliwiło to udostępnianie klientom danych w różnorodnej postaci, odpowiedniej dla konkretnego zastosowania. Standardowe aplikacje CGI odczytywały informacje ze standardowego wejścia (STDIN) i wypisywały dane wynikowe na standardowe wyjście (STDOUT), posługując się także zmiennymi środowiskowymi. WinCGI - Windowsowa odmiana CGI - odczytuje informacje z pliku oraz produkuje dane wynikowe w postaci pliku HTML. Jest to postęp w stosunku do statycznych stron HTML, ale konieczność kreowania odrębnego procesu dla każdego żądania klienta skutkowała częstym "zatykaniem" lub nawet zawieszaniem serwera.

Dwie znane nam wszystkim firmy ;-) Microsoft i Netscape, które doceniły dynamiczne tworzenie stron WWW, postanowili zaradzić niedostatkom CGI. Stworzyli oni (niezależnie od siebie, oczywiście :-) ) serwery WWW funkcjonujące dzięki dołączanym bibliotekom DLL, korzystając z odpowiedniego API (nie WinAPI, nie :-) ): stosunkowo prosty ISAPI Microsoftu oraz trochę bardziej skomplikowany NSAPI Netscape. Wspomniane przed chwilą dołączane biblioteki DLL są nazywane (z racji swego charakteru) rozszerzeniami serwera WWW (ang. WWW server extensions). Mają one tą przewagę nad procesami CGI, iż całe przetwarzanie informacji odbywa się w ramach tej samej przestrzeni adresowej procesu-serwera, dzięki czemu komunikacja jest szybsza, wygodniejsza i mniej wymagająca w stosunku do zasobów systemowych. Choć Delphi (od wersji 4 w górę) umożliwia tworzenie rozszerzeń serwerów zarówno ISAPI i NSAPI (choć nie tylko, można też tworzyć aplikacje CGI), to w tym artykule zajmiemy się tylko ISAPI. Do uruchomienia rozszerzeń serwera ISAPI potrzebny jest serwer WWW - jeśli masz Win 98, to polecam Personal Web Server (jest w katalogu Add-Ons\Pws na CD Windowsa 98) lub jakikolwiek inny serwer klasy shareware / freeware. Aby uruchomić skrypty w PWS, instalujemy go, kopiujemy skrypty do katalogu Cgi-bin, a w przeglądarce wpisujemy:

http://localhost/cgi-bin/rozszerzenie.dll/jakasakcja

Tworzymy rozszerzenia serwera WWW


Przechodzimy do ciekawszej części rozdziału. Do tworzenia rozszerzeń serwera służą komponenty z grupy WebBroker (paleta Internet). Występują one na pewno w wersji Enterprise, nie ma ich w wersji Personal (może da się je dokupić na stronie www.borland.com).

Aby utworzyć rozszerzenie ISAPI, wybieramy pozycję New|Other i na karcie WebSnap wybieramy pozycję WebSnap Application. W otwartym oknie wybieramy pierwszą pozycję (ISAPI/NSAPI Dynamic Link Library). Pozostałe opcje nie są dla nas istotne (na tym poziomie zaawansowania, ja zadowalam się standardowymi ustawieniami). Na nowo wygenerowanym module WWW umieszczamy jeszcze komponent TWebDispatcher (paleta Internet).

Po wybraniu rozszerzenia Delphi stworzy projekt oparty o formularz TWebModule (zwany po prostu modułem WWW). Formularz jest pochodnym w stosunku do modułu danych (TDataModule) i zawiera elementy do obsłużenia żądania w formie HTTP. Tak jak moduł danych, tak moduł WWW nie pozwala na umieszczenie w nim komponentów wizualnych. Dopuszczalne są jedynie komponenty niewidoczne, w szczególności wszystkie kontrolki bazodanowe, jak również kontrolki ze strony Internet Palety Komponentów. Umożliwia to określenie reguł business rules aplikacji internetowej na takiej samej zasadzie, jak komponenty formularza TDataModule określały ją dla "klasycznej" aplikacji bazodanowej.

Podstawowe elementy funkcjonalne modułu WWW to jego akcje. Każda określa reakcję na pojedyncze żądanie klienta. Komponentem reprezentującym pojedynczą akcję jest TWebActionItem, natomiast całość akcji modułu reprezentowanych jest przez jego właściwość Actions. Każda akcja indentyfikowana jest unikalną "ścieżką" używaną w specyfikacji URL i obecną pod właściwością akcji PathInfo.

Aplikacja internetowa może być oparta również na zwykłym module danych TDataModule. Wystarczy umieścić w takim module komponent TWebDispatcher z palety Internet. Twór ten przejawia funkcjonalność modułu WWW. Pozwala to przeniesienie na grunt aplikacji internetowych skomplikowanych być może reguł business rules aplikacji bazodanowej - za pomocą pojedynczej operacji pobrania komponentu z Palety! Jedyna różnica polega na tym, że dostęp do akcji HTTP odbywa się przez komponent TWebDispatcher a nie przez moduł danych.

Obsługa akcji TWebModule odbywa się w ramach zdarzenia OnAction reprezentującego akcję komponentu TWebActionItem. Aby dostać się do tych procedur zdarzeniowych, klikamy formularz TWebModule (lub komponent TWebDispatcher), wybieramy właściwość Actions i klikamy ikonę z wielokropkiem (ellipsis). Otworzy to edytor akcji. Ikony na pasku narzędzi pozwalają na dodanie lub usunięcie akcji lub zmianę ich kolejności. Podświetlenie akcji czyni ją dostępną dla Inspektora Obiektów.

Elementem decydującym o zewnętrznym przejawie danej akcji w treści żądania jej jej właściwość PathInfo. Jej zawartość jest jednym z członów specyfikacji URL (o tym za chwilę).

Przechodząc na kartę Events odpowiedniej akcji i generując zdarzenie OnAction, mamy możliwość odpowiedzenia na akcję. Oto szkielet procedury zdarzeniowej:

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
 
end;


Parametry tej procedury to wszystkie informacje niezbędne do obsługi zdarzenia. Żądanie klienta jest reprezentowane przez parametr Request. Jako Response należy odesłać informację zwrotną, którą może być np. wynikowa strona HTML.

Poniższy kod przedstawia proces tworzenia przykładowej wynikowej strony HTML. Ponieważ fizycznie jest ona sekwencją linii składowych, najwygodniejszym komponentem do jej obsługi będzie TStringList. Wszystkie one są następnie konkatenowane (ich separatorem jest sekwencja CR/LF), a łańcuch wynikowy przypisujemy właściwości Content wynikowego komponentu Response (za konkatenację odpowiedzialna jest właściwość TStringList.Text).

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  Page: TStringList;
begin
  Page := TStringList.Create;
  try
    with Page do
    begin
      Add('<HTML>');
      Add('<HEAD>');
      Add('<TITLE>Moja pierwsza dynamiczna strona stworzona ' +
        'w Delphi</TITLE>');
      Add('</HEAD>');
      Add('<BODY>');
      Add('<B>Ta strona jest stworzona dynamicznie ' +
        'przez Delphi</B>');
      Add('<P><HR>');
      Add('To jest przykład do artykułu Internetowe ' +
        'zastosowania Delphi.');
      Add('Artykuł możesz znaleźć na stronie ' +
        '<A href="http://www.delphi.host.sk">');
      Add('www.dephi.host.sk</A>');
      Add('</BODY>');
      Add('</HTML>');
    end;
    Response.Content := Page.Text;
  finally
    Page.Free;
  end;
  Handled := True;
end;


Akcję, której odpowiada pokazana wyżej procedura zdarzeniowa, nazwałem Test a jej właściwość PathInfo ustawiłem na /test. Teraz, aby przetestować naszą bibliotekę, kompilujemy ją i umieszczamy w katalogu \ISAPI naszego serwera WWW. Uruchamiamy przeglądarkę i wpisujemy:

http://localhost/isapi/przyklad.dll/test


Przyklad.dll to nazwa Twojej biblioteki, możesz ją zmienić.

Widzisz już, że tworzenie dynamicznych stron WWW na poziomie podstawowym jest dziecinnie prostym zadaniem. W niedługim czasie dodam artykuł o bardziej zaawansowanym tworzeniu dynamicznych stron WWW przy użyciu Delphi.

UWAGA: Aplikacja ISAPI również korzysta z obiektu globalnego reprezentującego aplikację - Application. Nie jest to jednak nasz znajomy z modułu Forms, ale zmienna klasy TWebApplication z modułu HTTPApp. W związku z tym nie należy włączać do projektu modułu Forms, aby uniknąć problemów.

4 komentarze

lukaszguzik 2008-03-05 18:53

zrobiłem na tak napisałeś i jak potem pisze w adresie: www.firewoolf.nets.pl/DLLs/Project1.dll/MCRegister to nie dziala (pisze ze strona nie istnieje) a jak wpisze bez tego MCRegister to działa (MCRegister - to dałem zamiast Twojego Test)

unfa 2005-03-16 18:25

Ja stawiam na 6, bo lubię, jak mnie lubią :>

Bełdzio 2004-09-02 17:19

mam takie pytanie : Czy będziesz dodawał coś jeszcze do tych artów czy to będzie to samo co na Twojej stronie ?
Ode mnie masz 5

brodny 2004-09-02 17:22

Może coś jeszcze napisze ale na razie poprawiam bo wersja na 4p była raczej nieładnie sformatowana :)