Przedmiot: Programowanie usług internetowych - Delphi Przygotował: K. Strzałkowski Rok V. Semestr IX. Wydział ZiMK Ćwiczenie 3 Przekazywanie danych do programu CGI 1. Odbieranie w programie wartości zmiennych systemowych Opracuj program o nazwie Srod.Exe którego zadaniem jest wyświetlenie na stronie wartości niektórych zmiennych systemowych. Proponowana postać pliku projektu Srod.Dpr: program Srod; uses SysUtils; const listazm: array [1..20] of String [30] = ( 'SERVER_NAME', 'SERVER_PROTOCOL', 'SERVER_PORT', 'SERVER_SOFTWARE', 'GATEWAY_ITERFACE', 'REQUEST_METHOD', 'DOCUMENT_ROOT', 'PATH_TRANSLATED', 'HTTP_REFERER', 'SCRIPT_NAME', 'PATH_INFO', 'QUERY_STRING', 'CONTENT_TYPE', 'HTTP_ACCEPT','CONTENT_LENGTH','REMOTE_HOST','REMOTE_USER', 'REMOTE_IDENT', 'HTTP_FROM', 'HTTP_USER_AGENT') ; var i: integer; for i:= Low(listaZm) to High(listaZm) do writeln(listazm[i] + ' = ' + GetEnvironmentVariable(listaZm[i]) + '<BR>'); Uzupełnij program o definicje procedur PoczatekHTML i KoniecHTML przeznaczonych do wyprowadzania początku i końca zapisu strony. Procedury umieść bezpośrednio w pliku projektu lub w dołączonym module. Skompiluj program. Plik wynikowy Srod.Exe skopiuj do podkatalogu \CGI-BIN serwera. Przetestuj działanie programu dla różnych wywołań wpisywanych w polu adresowym przeglądarki. 2. Pobieranie danych z formularza Zapisz w pliku o nazwie Form.HTML zapis strony wyświetlający formularz: <HTML><HEAD> <TITLE>Przyklad obslugi formularza </TITLE> </HEAD><BODY> <H1>Przyklad obslugi formularza</h1> <HR> <FORM ACTION="http://localhost/cgi-bin/Form.Exe" METHOD="GET"> Nazwisko: <INPUT TYPE="TEXT" NAME="Nazwisko"> <P> Imie: <INPUT TYPE="TEXT" NAME="Imie"> <P> <INPUT TYPE="SUBMIT" VALUE= Wyslij dane > </FORM> <HR> <I>Strona wygenerowana przez HTML<I> </BODY></HTML> 1
Plik skopiuj do katalogu macierzystego serwera i przetestuj wyświetlanie strony. Zaobserwuj jaki adres wyświetlany jest w polu adresowym przeglądarki po naciśnięciu przycisku Wyślij dane. Opracuj program CGI o nazwie Form.Exe odbierający dane z formularza. Proponowana postać pliku projektu: program Form; uses SysUtils; var Dane: String; Dane:= GetEnvironmentVariable('CONTENT_LENGTH'); writeln('metoda : ' + GetEnvironmentVariable('REQUEST_METHOD')+ '<BR>'); writeln('dl ciagu na wejsciu : ' + Dane + '<BR>'); writeln('dane w zmiennej srodowiska: ' + GetEnvironmentVariable ('QUERY_STRING') + '<BR>'); Skopiuj plik wykonywalny programu do odpowiedniego katalogu, uzupełnij program o definicje procedur PoczatekHTML i KoniecHTML oraz przetestuj współdziałanie strony i programu. Opracuj samodzielnie (poprzez odpowiednią adaptację programu Form.Dpr) program odbierający dane wysyłane z wykorzystaniem metody POST. Wskazówka: Należy odpowiednio zmienić atrybut METHOD w znaczniku FORM formularza. Ponieważ metoda POST przesyła dane poprzez standardowy strumień wyjściowy StdOut, a nie przez zmienną QUERY_STRING to należy w programie Form.Dpr dodać instrukcje odczytujące znaki w ilości wyznaczanej zmienną CONTENT_LENGTH. Na przykład: dl:=strtoint(getenvironmentvariable('content_length')); if dl>0 then Dane:= ; for i:=1 to dl do read(znak); Dane:=Dane+znak; Rozbuduj program Form.Dpr (lub jego wersję zmodyfikowaną) o część dodatkową wycinającą z ciągu danych wartości wpisane w polach formularza. Zastosuj funkcję pomocniczą: function Pole(Dane:string; NazwaPola:string):string; var Napisy: TStringList; Napisy:=TStringList.Create; Dane:=StringReplace(Dane,'&', #10, [rfreplaceall]); {zamiana & na #10 } Napisy.Text:=Dane; Pole:=Napisy.Values[NazwaPola]; Napisy.Free; 2
Zastosowany w funkcji typ TStringList jest zdefiniowany w module Classes, dlatego należy odpowiednio rozszerzyć specyfikację uses. Przetestuj działanie programu. 3. Przykład programu zapisującego Cookie Opracuj program CGI o nazwie Imie.Exe używającego cookie do zapamiętania imienia użytkownika. Proponowana postać pliku projektu: program Imie; uses SysUtils, Classes; var kok, dane, imie: String; kok:=getenvironmentvariable('http_cookie'); if kok<>'' then kok:=pole(kok, 'Imie'); dane:=getenvironmentvariable('query_string'); if dane<>'' then imie:=pole(dane, 'Imie'); writeln('set-cookie: imie=',imie); // ustawienie cookie imie o // wartosci wczytanej if imie<>'' then writeln('<hr><b> Dziękuję. Zapamietalem Twoje imie ',imie) else if kok<>'' then writeln('<hr><b>witaj ', kok, '. Fajnie ze tu znowu zagladasz.</b>') else writeln( '<hr><b>witaj. Jestes tu po raz pierwszy. Podaj imie </b><hr>'); writeln( '<form method="get" action="http://localhost/cgi-bin/imie.exe">'); writeln('imie: <input type="text" name="imie">'); writeln('<input type="submit" value="ok">'); writeln(' </form>'); Uzupełnij program o definicje procedur PoczatekHTML i KoniecHTML oraz definicję funkcji Pole przeznaczonej do wycinania wartości danych ze zmiennych QUERY_STRING i HTTP_COOKIE. W zmiennej HTTP_COOKIE ciasteczka są przechowywane w postaci: nazwa1=wartosc1;nazwa2=wartosc2;nazwa3=wartosc3;... Opisy zmiennych cookie rozdzielane są średnikami odmiennie jak w zmiennej QUERY_STRING gdzie znakiem separującym jest &. Z tego powodu definicja funkcji Pole powinna być uzupełniona instrukcją: Dane:=StringReplace(Dane,';', #10, [rfreplaceall]); {zamiana ; na #10 } 3
Skopiuj plik wykonywalny programu do odpowiedniego katalogu i przetestuj działanie programu. Przy pierwszym uruchomieniu programu po umieszczeniu w polu adresowym przeglądarki wywołania: http://localhost/cgi-bin/imie.exe program wyświetla formularz z pytaniem o imię. Po wpisaniu imienia i kliknięciu przycisku OK program jest ponownie automatycznie wywoływany zgodnie z wartością atrybutu ACTION formularza. Tym razem wywołanie jest uzupełniane parametrem Imie o wartości podanej przez użytkownika. Wykrycie w programie tej zmiany adresu powoduje, że tym razem wyświetlana jest jedynie informacja o zapamiętaniu imienia. Jednocześnie program tworzy cookie Imie. Fakt utworzenia cookie można sprawdzić (w przeglądarce Firefox) w opcji menu: Narzędzia Opcje zakładka Prywatność ramka Ciasteczka Wyświetl ciasteczka Na liście ciasteczek należy odszukać i rozwinąć witrynę localhost i kliknąć wiersz ciasteczka by wyświetlić jego dane. Przy ponownym wpisaniu w polu adresowym przeglądarki wywołania jak zamieszczone powyżej program działa inaczej. Następuje ustalenie istnienia ciasteczka z zapisem imienia, odczytanie jego wartości, a następnie wyświetlenie tego imienia. Formularz nie jest wyświetlany. Ponowne wyświetlenie formularza nastąpi dopiero po zamknięciu przeglądarki i ponownym jej uruchomieniu. Powodem takiego działania jest fakt że ważność cookie została domyślnie określona jako do końca pracy przeglądarki. 4. Zastosowanie formularza HTML do rejestracji nowego użytkownika serwisu. Opracuj formularz HTML do wprowadzania nazwy użytkownika (Login) i hasła dla nowo-rejestrowanego użytkownika. Zastosuj następujący nagłówek formularza: <FORM ACTION="http://localhost/cgi-bin/Form2.Exe" METHOD="GET"> Opracowaną stronę zapisz w pliku Form2.HTML, skopiuj do katalogu macierzystego serwera i przetestuj Opracuj program Form2.Exe odbierający dane z formularza, sprawdzający ich poprawność i zapisujący nowy rekord w tabeli Użytkownicy. Program powinien wyświetlać stronę z komunikatem o powodzeniu lub braku powodzenia rejestracji. Do zapisywania rekordu w tabeli wykorzystaj zapytanie SQL ustawiane we właściwości CommandText komponentu SQLDataSet. Proponowana postać instrukcji: SQLDataSet1.CommandText:= 'INSERT INTO Uzytkownicy (Login, Haslo) VALUES (' +#39+Login1+#39+ ', '+#39+Haslo1+#39+')'; Gdzie: Login1 i Haslo1 - zmienne do których przypisano wartości wpisane w polach formularza, natomiast #39 znak apostrofu. Skopiuj plik wykonywalny programu do odpowiedniego katalogu i przetestuj współdziałanie strony i programu. Sprawdź także poprawność wpisu w tabeli Uzytkownicy. 4
ZADANIA 1. Opracuj stronę i aplikację do rejestracji nowych zapisów w tabeli Katalog. 2. Opracuj aplikację wyświetlającą na stronie internetowej tabelę Katalog w taki sposób by wartości wyświetlane w kolumnie JM miały postać odsyłaczy do innego programu Wartosc.Exe. Każdy odsyłacz powinien zawierać parametr określający nazwę wybranej jednostki miary. Opracuj także program Wartosc.Exe który wyświetla na stronie wartość wszystkich towarów dla wybranej (i przekazanej parametrem w adresie wywołującym) jednostki miary. 5