Procesarea datelor din formulare
Valorile completate în cadrul unui formular pot fi transmise înspre server pe mai multe cai, metodele de baza fiind GET sau POST, dar pot fi utilizate si posibilitatile oferite de elementul ISINDEX. Fiecare metoda trateaz&# 616d33g 259; intrarile într-un mod aparte, avînd în comun doar variabilele de mediu.
<ISINDEX> este un tag vid de un tip mai special. Includerea lui în header s-a facut initial (înainte de existenta formularelor) pentru ca acesta sa activeze un cîmp text în bara de butoane sau în fereastra navigatorului. Vizitatorul putea tasta în acel cîmp sirul de caractere dorit si, apasînd RETURN, trimitea datele serverului. Este o modalitate de a implementa interactiunea înainte de existenta formularelor.
Metoda se alege în functie de aplicatie. GET poate fi folosit în cazul cînd informatia transmisa este scurta (de exemplu un cuvînt cheie si tipul acestuia). Daca formularul lucreaza cu mai multe cîmpuri de date, variabilele de mediu pot fi trunchiate, dar acest defect se poate elimina prin apelul metodei POST.
Metoda folosita de protocolul HTTP pentru a trimite datele la server este stabilita de atributul METHOD al elementului FORM, atribut ce poate lua doua valori:
get Cu metoda "get" a protocolului HTTP, setul de date al formularului este adaugat la adresa URI specificata de atributul ACTION, folosind semnul întrebarii ("?") ca separator. Noua adresa URI este trimisa astfel la agentul (programul) care o proceseaza.
post Cu metoda "post" a protocolului HTTP, setul de date al formularului este inclus în corpul formularului si transmis agentului (programului) care-l proceseaza.
Metoda "get" trebuie folosita cînd formularul este idempotent, adica nu cauzeaza alte efecte laterale. Multe cautari în bazele de date nu au efecte laterale (secundare, ascunse) vizibile si reprezinta aplicatii ideale pentru aceasta metoda. În plus datele din setul de date al formularului trebuie sa fie obligatoriu, în exclusivitate, caractere ASCII.
Daca, însa, serviciul asociat cu procesarea formularului are efecte laterale (side-effects), ca de exemplu cazul în care formularul modifica baza de date sau reprezinta o subscriere la un serviciu, se va folosi metoda "post". Aceasta ofera si posibilitatea de a trimite date din întreg setul de caractere (Unicode), prin specificarea atributului enctype="multipart/form-data".
Un control de succes este acel control al unui formular "valid" pentru a fi trimis (la Submit). Fiecare astfel de control are numele sau ascociat, într-o pereche, cu valoarea sa curenta. Aceasta pereche face parte din setul de date al formularului. Un control de succes trebuie sa fie definit într-un element FORM si trebuie sa aiba un nume. Nu toate controalele unui formular sînt de succes. Astfel:
Controalele care sînt dezactivate/inactive (disable) nu pot fi de succes
Daca un formular contine mai mult de un buton Submit, numai acela care este activat (apasat) este de succes
Toate casutele de marcare (checkbox-urile) setate la on (activate), si numai ele, sînt de succes
Dintre butoanele radio care au aceeasi valoare a atributului NAME numai cel care activ/setat (pe "on") poate fi de succes.
Pentru meniuri (liste de selectie), numele controlului este oferit de un element SELECT iar valorile sînt date de elementele OPTION. Numai optiunile selectate sînt de succes.
Valoarea curenta a unui element de selectare a unui fisier este o lista de unul sau mai multe nume. La transmiterea unui formular, continutul fiecarui fisier este transmis cu restul datelor din formular. Continutul fisierului este "împachetat" conform tipului continutului formularului (content-type).
Valoarea curenta a unui obiect este determinata de implementarea specifica a acelui obiect.
Daca un control nu are o valoare curenta cînd formularul este transmis, browserul nu este obligat sa îl trateze ca pe un control de succes. În plus, nu vor fi considerate controale de succes nici:
Butoanele Reset
Elementele OBJECT care au atributul DECLARE setat.
Controalele ascunse (hidden) care chiar daca nu sînt afisate de browsere (nu sînt vizibile) pot fi controale de succes.
Exemplu:
<FORM action="..." method="post">
<P>
<INPUT type="password" style="display:none"
name="invisible-password" value="mypassword">
</P>
</FORM>
va crea un control de succes pentru elementul parola, adica o pereche din numele "invisible-password" si valoarea "mypassword".
Cînd utilizatorul trimite un formular (prin activarea butonului Submit), browserul sau realizeaza urmatorii pasi (urmatoarele actiuni):
Pasul 1: Identificarea controalelor de succes (successful controls)
Pasul 2: Crearea unui set de date asociat formularului
Un set de date asociat unui formular este o secventa de perechi nume-control/valoare-curenta construita din controale de succes.
Pasul 3: Codificarea setului de date
Setul de date creat la pasul anterior este codificat în conformitate cu tipul continutului (content type) specificat de atributul ENCTYPE al elementului FORM.
Pasul 4: Transmiterea setului de date codificat
În final setul de date astfel codificat este trimis de browserul client agentului de prelucrare (programului) desemnat de atributul ACTION, folosind protocolul specificat de atributul METHOD.
Aceasta specificare nu acopera toate metodele valide de trimitere sau tipurile de continut ce pot fi folosite cu formularele. Totusi, browserele compatibile HTML 4.0 trebuie sa suporte conventiile stabilite în urmatoarele cazuri:
Daca metoda este "get" si actiunea (atributul ACTION) este o adresa (URI) HTTP, browserul ia valoarea atributului ACTION, adauga un "?" la ea, iar apoi adauga setul de date asociat cu formularul, stabilind tipul continutului (content type) la "application/x-www-form-urlencoded". Browserul urmeaza apoi noua legatura astfel creata. În acest scenariu, datele formularului sînt restrictionate la codurile ASCII.
Daca metoda este "post" si actiunea (atributul ACTION) este o adresa (URI) HTTP, browserul va genera o tranzactie HTTP "post" folosind valoarea atributului ACTION si un mesaj creat în conformitate cu tipul continutului (content type) specificat de atributul ENCTYPE.
Pentru orice alta valoare a atributelor ACTION si METHOD comportamentul este nespecificat. Browserele trebuie sa afiseze raspunsul generat de tranzactiile HTTP "get" si "post".
Atributul ENCTYPE al elementului FORM specifica tipul continutului folosit pentru a codifica setul de date asociat formularului în momentul transmiterii catre server. Browserele utilizatorilor trebuie sa suporte tipurile indicate în cele ce urmeza. Comprtamentul pentru alte tipuri este nespecificat:
application/x-www-form-urlencoded
Acesta este tipul implicit. Formularele transmise cu acest tip de continut trebuie codificate dupa cum urmeaza:
Numele controalelor si valorile sînt "escaped". Caracterele blanc (spatiu) sînt înlocuite de , iar caracterele rezervate sînt si ele "escaped": caracterele non-alphanumeric sînt înlocuite cu `%HH', (semnul procent si doua cifre hexazecimale reprezentînd codul ASCII al caracterului). Sfîrsitul de linie (line break) este reprezentat ca o pereche "CR LF" (adica `%0D%0A').
Perechile nume/valoare pentru controale apar în ordinea din document. Numele este separat de valoare prin semnul egal si fiecare pereche este separata de celelalte prin semnul`&'.
Tipul de continut "application/x-www-form-urlencoded" este ineficient pentr a trimite cantitati mari de date binare sau texte continînd caractere non-ASCII. Tipul de continut "multipart/form-data" va fi folosit cînd se trimit formulare ce contin fisiere, date non-ASCII si date binare.
multipart/form-data
Este tipul folosit cînd continutul setului de date este alcatuit din mai multe feluri de (seturi de) date. Se supune regulilor de la toate sirurile de date (stream-urile) de tip multipart MIME. Un stfel de mesaj contine o serie de parti, fiecare reprezentînd un control de succes. Partile sînt trimise agentului care le proceseaza în ordinea în care apar în document. La fel ca la orice tip multipart MIME, fiecare parte are un header optional "Content-Type" care implicit are valoarea "text/plain" si care este însotit de un parametru "charset". Fiecare parte trebuie sa contina:
Un header tip "Content-Disposition" a carui valoare sa fie "form-data".
Un atribut NAME care specifica numele controlului corespondent. Numele controalelor care sînt codificate într-un set de caractere non-ASCII pot fi modificate.
Astfel, de exemplu, pentru controlul cu numele "mycontrol" partea corespunzatoare lui va fi specificata astfel: Content-Disposition: form-data; name="mycontrol"
Ca la toate transmiterile MIME, pentru a separa liniile de date se foloseste "CR LF" (`%0D%0A').
Daca se trimite un fisier (continutul lui) acesta trebuie sa fie identificat obligatoriu de tipul continutului (de exemplu"application/octet-stream"). Daca se trimit mai multe (ca rezultat al unei sigure selectii din formular), ele trebuie trimise ca "multipart/mixed", înauntrul lui "multipart/form-data". Fiecare fisier trebuie trimis cu un nume, specificat cu parameterul "filename" al headerului 'Content-Disposition: form-data'. Daca acesta nu este codificat ASCII el trebuie fie aproximat fie codificat.
Exemplu:
Acest exemplu ilustraza codificarea "multipart/form-data". Presupunem ca avem urmatorul formular:
<FORM action=https://server.dom/cgi/handle enctype="multipart/form-data"
method="post">
<P>
Numele Dvs? <INPUT type="text" name="submit-name"><BR>
Fisierele pe care le trimiteti? <INPUT type="file" name="files"><BR>
<INPUT type="submit" value="Send"> <INPUT type="reset">
</FORM>
Daca utilizatorul introduce "Larry" în controlul de tip text si selecteaza "file1.txt", browserul lui va trebui sa trimita urmatoarele date la server:
Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="submit-name"
Larry
--AaB03x
Content-Disposition: form-data; name="files"; filename="file1.txt"
Content-Type: text/plain
... contents of file1.txt ...
--AaB03x--
Daca utilizatorul selecteaza al doilea fisier (o imagine), cu numele "file2.gif", browserul va trebui sa contruiasca partile componente ale tranzactiei dupa cum urmeaza:
Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="submit-name"
Larry
--AaB03x
Content-Disposition: form-data; name="files"
Content-Type: multipart/mixed; boundary=BbC04y
--BbC04y
Content-Disposition: attachment; filename="file1.txt"
Content-Type: text/plain
... contents of file1.txt ...
--BbC04y
Content-Disposition: attachment; filename="file2.gif"
Content-Type: image/gif
Content-Transfer-Encoding: binary
...contents of file2.gif...
--BbC04y--
--AaB03x-
|