Laboratorium Sieci Komputerowych
Formularze HTML, interfejs CGI
1. CGI
CGI (Common Gateway Interface) jest specyfikacją umożliwiającą komunikację przeglądarki klienta z programami, które są uruchamiane przez serwer WWW.
CGI odbiera informacje przekazywane przez przeglądarkę klienta do serwera i przekazuje je do programów CGI. Odbiera również dane wyjściowe programu i przesyła je do klienta.
Pozwala to na tworzenie dynamicznych dokumentów HTML, tzn. takich, które na podstawie danych odebranych od klienta są generowane przez program uruchomiony na serwerze WWW. Mechanizm ten umożliwia tworzenie dużych, interaktywnych aplikacji typu: sklep internetowy, udostępnianie informacji z baz danych, obsługa list dyskusyjnych, prezentacja aktualnych informacji.
Komunikacja z użyciem CGI przebiega następująco:
serwer wysyła dokument HTML;
klient wprowadza dane, dane są kodowane i przesyłane do serwera (metodą GET lub POST);
serwer odbiera dane, uruchamia program CGI i przekazuje mu dane przez interfejs CGI;
program CGI przetwarza dane i zwraca wyniki do serwera;
serwer odsyła wyniki programu do klienta.
Metody przekazywania danych do programu CGI:
Metoda GET: tworzony jest nowy URL i do serwera przesyłane jest zlecenie: GET ścieżka/nazwa?info, gdzie 'nazwa' jest nazwa skryptu, a 'info' przekazywanymi danymi (w formacie: nazwa1=dana1&nazwa2=dana2). Dane są dostępne w zmiennej środowiskowej QUERY_STRING.
Metoda POST: informacja jest przekazywana kanałami we/wy (strumieniami stdin/stdout). Ich ilość jest przekazywana w zmiennej środowiskowej CONTENT_LENGTH. Postać danych jest formatu: nazwa1=wartość1&nazwa2=wartość2. Metoda ta pozwala na przekazanie dużej ilości danych i rozwiązuje problem zastrzeżonych znaków. Dane do serwera są wysyłane za pomocą komendy POST. Zastrzeżone znaki są kodowane tak jak w URL-u.
Gdy serwer uruchamia program CGI tworzone są dodatkowe zmienne środowiskowe. Niektóre z nich to:
- REQUESTED_METHOD - metoda przekazywania danych: GET lub POST.
- PATH_INFO - jeśli np. katalog root dla dokumentów jest /var/hhtdocs, program jest identyfikowany przez url: htbin/formdemo/more, to zmienna ta = /more.
- PATH_TRANSLATED - jeśli j.w., to zmienna ta = /var/htdocs/more.
- QUERY_STRING - łańcuch znaków (niekodowany) za znakiem '?' w URL-u wywołującym program (dla metody GET). Potrzebne parametry program powinien uzyskać raczej z tej zmiennej niż z linii komend.
- CONTENT_LENGTH - długość dołączonych danych (dla metody POST).
Skrypty CGI
Skrypty CGI (podobnie jak dokumenty HTML) muszą mieć prawa wykonywania dozwolone dla wszystkich (chmod 755 plik)
Na programy CGI jest przeznaczony z reguły osobny katalog, np. cgi-bin. Serwer jest skonfigurowany tak, że pliki z tego katalogu mają być uruchamiane, a nie pokazywane.
Program CGI może być wywoływany nie tylko z formularza, ale np. jako link.
Program CGI może być napisany np. w języku C/C++, Perl, Bourne shell, C shell, Visual Basic.
Różnice w implementacji CGI mogą wystąpić na różnych platformach sprzętowych (np. zmienne środowiskowe Visual Basica na WindowsNT).
Testować programy CGI można wpierw z linii komend.
To, co program CGI wyśle na standardowe wyjście zostanie przesłane do przeglądarki klienta. Program CGI może zwracać różne rodzaje danych: dokument HTML, tekst, obrazek, itp.
Program CGI musi wysłać na stdout:
nagłówek zawierający informacje w standardzie MIME o typie danych przesyłanych przez program; jest to przydatne do rozpoznania, co zrobić z danymi: jaką aplikację uruchomić, aby je pokazać.
pustą linię tekstu;
dane dla klienta (tekst, obrazek, itp.).
Przykład:
echo Content-type: text/html
echo
echo <HTML> treść </HTML>
Dodatki
Numery portów dla niektórych usług:
http: 80, ftp: 21, telnet: 23, news: 119, mailto: 25, gopher: 70.
Specyfikacja HTTP (Hypertext Transfer Protocol) określa żądania, jakie mogą być przesyłane do portu 80. Są to m.in: GET, HEAD, PUT, POST, DELETE, LINK, UNLINK.
URL:
http|ftp|mailto|gopher|WAIS|news|file|telnet://host.domena:port/ścieżka/plik (może to być dokument tekstowy, obrazek, animacja, skrypt CGI)
Znaki zastrzeżone w URL:(+, &, =, /, ~, %, spacja, <, >, :) koduje się podając znak % i liczbę heksadecymalne (np. %2B).
Formularze HTML
Najbardziej podstawowym, historycznym już elementem strony HTML, pozwalającym na przekazanie danych do serwera WWW, jest znacznik ISINDEX. Udostępnia jedno pole tekstowe do wprowadzania. Składnia: <ISINDEX ACTION=”url” PROMPT="opis">.. Dana jest wczytywana przez program CGI z linii komend (jako parametr).
Formularze (ang. fill-out forms) pozwalają na konstruowanie rozbudowanych kwestionariuszy i ankiet, zawierających wiele różnych pól do wprowadzania. Definiuje się je za pomocą znacznika <FORM atrybuty> .. </FORM>.
Mogą wystąpić następujące atrybuty:
- ACTION = URL, do którego mają być przekazane dane, z reguły wskazanie na skrypt CGI. Na serwerze WWW skrypty są lokowane w oddzielnych katalogach, serwer rozpoznaje więc, czy ma przesłać dokument, czy wykonać skrypt. Jeśli brak atrybutu ACTION, po wypełnieniu pola wywoływany jest ten sam dokument, który wygenerował stronę (jest to sensowne, jeśli dokument został wygenerowany przez skrypt CGI). Atrybut ACTION może zawierać URL mailto, pozwalający wysłać dane pocztą.
Przykład: ACTION=”http://serwer:port/cgi-bin/skrypt.cgi”
- METHOD = metoda HTTP użyta do przekazania danych do serwera WWW (GET, POST).
- ENCTYPE = sposób kodowania transmitowanych danych z formularza. Domyślnie: application/x-www-form-urlencoded. Znaki zastrzeżone kodowane są z użyciem % i liczby zapisanej hexadecymalnie, np. %2B. Może jeszcze być: multipart/form-data, dla przesyłu plików binarnych.
Teksty, listy, tabele itp. są oznaczane za pomocą pól wprowadzania (ang. input fields). Tworzy się je za pomocą znaczników INPUT, TEXTAREA, SELECT. Najczęściej stosuje się znacznik INPUT w postaci: <INPUT NAME=nazwa TYPE=typ .. inne_atrybuty>. Znacznik ten nie ma odpowiednika kończącego (</INPUT>). Dane są przekazywane metodą GET lub POST w postaci: nazwa1=dana1&nazwa2=dana2. Nazwa jest nazwą pola zdefiniowaną w poleceniu INPUT, a dana jest informacją wprowadzoną w to pole.
Niektóre pola formularza HTML 3.0:
<INPUT NAME="text-field" prosty tekst
TYPE="text"
SIZE=40 szerokość pola w przeglądarce
MAXLENGTH=80 max. ilość znaków
VALUE="cos"> wartość inicjująca
<INPUT NAME="password-field" hasło (znaki wyświetlane jako *)
TYPE="password"
SIZE=20>
<INPUT NAME="check" pole dwustanowe (wybrane - nie_wybrane)
TYPE="checkbox"
VALUE="Tak" wartość inicjująca
CHECKED> jeśli jest ta opcja, to na początku wybrane
<INPUT TYPE="submit" przycisk wyslania danych do serwera
VALUE="OK" napis na przycisku
SRC=url> url do obrazka, który będzie przyciskiem
<SELECT NAME="option-fields" selection box, wybór z kilku
MULTIPLE> jeśli jest ta opcja, to możliwych kilka wyborów
<OPTION VALUE="Y" wartość
SELECTED> jeśli jest ta opcja, to na początku wybrane
żółty napis
<OPTION VALUE="R"> wartość
czerwony napis
<OPTION>
zielony wartość taka jak napis