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-
|