Ce metode pot fi folosite pentru a trimite formularul. Folosind metodele GET și POST

Lucrări de laborator 1. Protocolul HTTP. Metode GET, POST. Formulare HTML s.

Partea teoretică

Ciclu de viață Solicitare HTTP

  1. Browser deschide conexiunea cu serverul
  2. Browserul trimite o cerere către server pentru a primi pagina
  3. Serverul generează un răspuns (cel mai adesea cod HTML) către browser și închide legătura
  4. Browserul procesează codul HTML și afișează pagina

Acordați atenție celor evidențiate îndrăzneţ. Chiar înainte de a vedea pagina solicitată pe ecran, conexiunea la server este închisă și a uitat de tine. Și când introduceți o adresă diferită (sau aceeași), sau faceți clic pe un link sau faceți clic pe un buton de formular HTML, același model se va repeta din nou.

Acest tip de muncă se numește "client server". Clientul în acest caz este browserul.

Așadar, conexiunea la serverul web durează doar câteva secunde (sau fracțiuni de secunde) - aceasta este perioada de timp dintre clic pe un link (sau alt tip de solicitare) și pagina începe să fie afișată. Majoritatea browserelor afișează un fel de indicator în timpul conexiunii, de exemplu, MS Internet Explorer afișează animația în colțul din dreapta sus.

Pentru a scăpa pentru totdeauna de percepția HTTP ca o „cutie neagră”, să ne „prefacem” că suntem un browser care folosește telnet:

  1. Hai să lansăm telnet ya.ru 80
  2. Să introducem următoarele în fereastra terminalului (dacă intrarea nu este afișată, este în regulă):

GET / HTTP/1.0[apăsați pe Enter aici]
Gazdă: ya.ru[aici apăsați Enter de două ori]

Apăsarea Enter corespunde de obicei combinației de caractere CR + LF, notate ca \r\n. Această notație va fi folosită mai jos.

Codul HTML al paginii http://ya.ru/ va rula pe ecran. După cum puteți vedea, nimic complicat.

Sursă Pagina curentă poate fi vizualizată în aproape orice browser selectând „Vizualizare|Sursă” din meniu.

Poze, rame - toate acestea sunt cereri suplimentare, exact aceleasi. De fapt, de unde provin imaginile din fereastra browserului: atunci când analizează (procesează) codul HTML, browserul dă peste eticheta https://i0.wp.com/ imagine"> face o cerere suplimentară către server - cerere Poze, și îl afișează în locul unde se află eticheta .



Încerca:

Telnet www.google.ru 80

GET /php/php5ru.png HTTP/1.0\r\n
Gazdă: ya.ru\r\n\r\n

Ceea ce veți vedea dacă vizualizați acest fișier png într-un editor de text va clipi pe ecran.

I-2. Formulare HTML. Metode de trimitere a datelor către server

Probabil că ați întâlnit deja formulare HTML:

  1. Introdu numele tau:

Economisire acest codîn fișierul HTML și vizându-l folosind browserul preferat, veți vedea formularul HTML familiar:

Introdu numele tau:

Să aruncăm o privire mai atentă la etichetele folosite în acest scurt exemplu.

Etichetă

, având o etichetă de capăt asociată
, setează de fapt forma. Atributele sale sunt ambele opționale:

  • acțiune- specifică URL-ul (complet sau relativ) la care trimis formă. Trimiterea unui formular este aceeași cerere către server ca toate celelalte (cum am descris deja mai sus).

Dacă acest atribut nu este specificat, majoritatea browserelor (mai precis, toate browserele cunoscute de mine) trimit formularul către documentul curent, adică „la sine”. Aceasta este o scurtătură convenabilă, dar conform standardului HTML atribut de acțiune necesar.

  • metodă - cale depunerea formularului. Sunt doi dintre ei.
    • OBȚINE- trimiterea datelor formular către bara de adresa.
      Este posibil să fi observat pe diferite site-uri web prezența unui „?” la sfârșitul adresei URL. și următoarele date în format parametru=valoare. Aici "parametru" corespunde sens atribut Nume elemente de formular (vezi mai jos despre etichetă ), și „valoare” - conținutul atributului valoare(conține, de exemplu, introducerea utilizatorului într-un câmp de text al aceleiași etichete ).
      De exemplu, încercați să căutați ceva în Yandex și acordați atenție barei de adrese a browserului dvs. Aceasta este metoda GET.
    • POST- datele formularului sunt trimise către organismul de cerere. Dacă nu este complet clar (sau complet neclar) ce este aceasta, nu vă faceți griji, vom reveni la această problemă în curând.

Dacă atributul metodă nespecificat - „GET” este implicit.

Etichetă - seturi element de formă, definit de atribut tip :

  • Sens "text" specifică un câmp de introducere a textului cu o singură linie
  • Sens "Trimite" specifică un buton care, atunci când este apăsat, provoacă trimitere formulare către server

Alte valori sunt posibile (și - nu este singura etichetă care definește un element de formular), dar le vom analiza în capitolele următoare.

Deci, ce se întâmplă când facem clic pe „OK”?

  1. Browserul se uită la elementele incluse în formular și formează din acestea atributele de nume și valoare datele formularului. Să presupunem că numele este introdus Vasia. În acest caz, datele formularului sunt nume=Vasya&okbutton=OK
  2. Browserul stabilește o conexiune cu serverul, trimite o cerere către server pentru documentul specificat în atribut acțiune etichetă
    , folosind metoda de trimitere a datelor specificată în atribut metodă(în acest caz - GET), transmiterea datelor din formular în cerere.
  3. Serverul analizează cererea primită, generează un răspuns, îl trimite către browser și închide conexiunea
  4. Browserul afișează documentul primit de la server

Trimiterea aceleiași solicitări manual (folosind telnet) arată astfel (presupunând că Numele domeniului site web - www.example.com):

telnet www.example.com 80

GET /cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK HTTP/1.0\r\n
Gazdă: www.example.com\r\n
\r\n

După cum probabil ați ghicit deja, a face clic pe butonul de trimitere de pe un formular cu o metodă de trimitere „GET” este același lucru cu introducerea adresei URL corespunzătoare (cu un semn de întrebare și datele formularului la sfârșit) în bara de adrese a browserului: http://www.example.com/cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK

De fapt, metoda GET este folosită ori de câte ori solicitați un document de la server prin simpla introducere a URL-ului acestuia sau făcând clic pe un link. Folosind , adresa URL este pur și simplu atașată cu un semn de întrebare și date de formular.

Acum să înlocuim prima linie a formularului nostru cu următoarele:

Am specificat metoda de trimitere ca „POST”. În acest caz, datele sunt trimise către server într-un mod ușor diferit:

telnet www.example.com 80

POST /cgi-bin/form_handler.cgi HTTP/1.0\r\n
Gazdă: www.example.com\r\n
Tip de conținut: application/x-www-form-urlencoded\r\n
Lungimea conținutului: 22\r\n
\r\n
nume=Vasya&okbutton=OK

Când utilizați metoda POST, datele formularului sunt trimise după „două intrări” - către corp cerere. Tot ce este mai sus este adevărat titlu cerere (și când am folosit metoda GET, datele formularului au fost trimise în antet). Pentru ca serverul să știe la ce octet să nu mai citească corpul cererii, antetul conține linia Conținut-Lungime; că datele formularului vor fi transmise în formular parametru1=valoare1¶metru2=valoare2..., iar valorile sunt transmise sub formă de urlencode - adică exact la fel ca folosind metoda GET, dar în corpul cererii - serverul este informat de antetul „Content-Type: application/x- www-form-urlencoded".

Avantajul metodei POST este că nu există limită pentru lungimea liniei de date a formularului.

Când utilizați metoda POST, nu este posibil să trimiteți formularul pur și simplu „urmând un link”, așa cum a fost cazul GET.

Când utilizați un formular POST, în atributul său acțiune De asemenea, puteți specifica parametrii formularului GET după semnul întrebării. Astfel, metoda POST include metoda GET.

/php/php5ru.png HTTP/1.0

: www.php5.ru

Ceea ce ați vedea dacă ați vedea acest lucru va clipi pe ecran png-fișier într-un editor de text.

Formulare HTML. Metode de trimitere a datelor către server folosind un formular

Una dintre cele mai comune aplicații ale oricărui limbaj de scripting pentru server este procesarea HTML- forme. Programarea web implică în mare parte procesarea diferitelor intrări ale utilizatorului.

RNR facilitează sarcina de procesare și parsare a formularelor primite de la browser, deoarece totul este construit în limbaj la cel mai de jos nivel capacitățile necesare. Prin urmare, programatorul nici măcar nu trebuie să se gândească la caracteristicile protocolului HTTPși mă întreb cum are loc trimiterea și primirea

CU HTML-forme pe care le-ați întâlnit deja când studiați limbajul de marcare HTML.

Să ne uităm la un exemplu de trimitere a unui mesaj dintr-un formular prin e-mail.

Listare e_mail.html. Trimiterea unui mesaj dintr-un formular prin e-mail

Trimiterea formularului prin e-mail

Adresa de e-mail protejat de roboții de spam. Pentru a-l vedea, trebuie să aveți JavaScript activat enctype=”text/plain” method=”post”>

Faceți clic pe Resetare și completați comanda.


Dacă procesați acest cod HTML cu un browser, va fi afișată o pagină web, care poate fi văzută pe ecranul monitorului:

Utilizatorul face clic pe un buton „Resetare”, iar câmpurile își iau valorile implicite. Formularul este completat de către utilizator și la un clic pe un buton "Trimite comanda" trimis la Această adresă de e-mail este protejată de spamboți. Pentru a-l vedea, trebuie să aveți JavaScript activat. De obicei, browserul nu trimite formularul în sine, ci încredințează această lucrare programului de e-mail instalat implicit pe sistemul de operare al computerului (de exemplu, Outlook). Scrisoarea se trimite sub forma:

subiect: Formular transmis de la Microsoft Internet Explorator

nume = Prohorov Viktor Sergheevici

value= Această adresă de e-mail este protejată de spamboți. Pentru a-l vizualiza, trebuie să aveți JavaScript activat

obj = „Orientări”

Scrisoarea este compusă din perechi nume=valoare, care sunt selectate în ordine din câmpurile de formular.

Să aruncăm o privire mai atentă la următorul exemplu.

Listare form_1.html

Introdu numele tau:

Salvarea acestui cod într-un fișier HTML form_1.htmlși vizându-l folosind un browser, puteți vedea formularul HTML:

Formularul este implementat de o etichetă de container . Eticheta indică prin atributele sale:

Adresa scriptului la care va fi trimis formularul;

Modalitatea de trimitere si caracteristicile datelor cuprinse in formular. Elementar si finala etichetele definesc limitele formularului. Indicarea lor este obligatorie.

Atributele etichetei containerului
(
toate optionale):

? acțiune--un atribut a cărui valoare este URL-adresa (completa sau relativa) a celui solicitat CGI-programe. Acest program va prelucra datele conținute în formular. Este acceptabil să folosiți intrarea MAILTO:URL.În acest caz, formularul va fi trimis prin e-mail. Dacă atributul acțiune nu specificati, continutul formularului va fi trimis catre URL adresa de la care a fost încărcată această pagină web, adică „pentru sine”. Aceasta este o abreviere convenabilă, dar conform standardului atribut HTML acțiune necesar.

? metodă-- definește o metodă HTTP, folosit pentru a trimite date de formular din browser către server. Atribut metodă poate lua două sensuri: obține sau post:

¦ obține- trimiterea datelor formularului în bara de adrese. Este posibil să fi observat pe diferite site-uri web prezența unui „?” la sfârșitul adresei URL. și următoarele date în format parametru=valoare. Aici "parametru" se potrivește cu valoarea atributului Nume elemente de formular (vezi mai jos despre etichetă ), A "sens"- continutul de atribut valoare(conține, de exemplu, introducerea utilizatorului într-un câmp de text al aceleiași etichete ).

De exemplu, încercați să căutați ceva în Yandex și acordați atenție barei de adrese a browserului dvs. Aceasta este calea obține.

¦ post- datele formularului sunt trimise în corpul cererii. Dacă nu este complet clar (sau complet neclar) ce este aceasta, nu vă faceți griji, vom reveni la această problemă în curând.

Dacă atributul metodă nespecificat - subînțeles "obține".

? enctype-- atribut opțional. Specifică tipul de conținut al formularului utilizat pentru a determina formatul de codificare la trimiterea acestuia. ÎN HTML două sunt definite valori posibile pentru atribut enctype:

¦ APPLICATION/X-WWW-FORM-URLENCODED(Mod implicit).

¦ MULTIPARTE/FORM-DATE.

Etichetă vă permite să creați șiruri de text, nume de fișiere, parole etc. în interiorul câmpurilor de introducere a formularului. Nu etichetă finală. Atribute și caracteristici de utilizare depinde de modul în care este folosit.

Etichetă - specifică elementul de formular definit de atribut tip:

¦ Înțeles "text" specifică un câmp de introducere a textului cu o singură linie.

¦ Înțeles "Trimite" specifică un buton care, atunci când este apăsat, trimite formularul către server.

Alte valori sunt posibile (și - nu este singura etichetă care definește un element de formular), dar le vom analiza în capitolele următoare.

Deci, ce se întâmplă când se face clic pe butonul OK?

1. Browserul se uită la elementele incluse în formular și le creează din atributele acestora NumeȘi valoare datele formularului. Să presupunem că numele este introdus Vasia. În acest caz, datele formularului: nume=Vasya&okbutton=OK.

2. Browserul stabilește o conexiune cu serverul, trimite o cerere către server pentru documentul specificat în atribut acțiune etichetă , folosind metoda de trimitere a datelor specificată în atribut metodă(în acest caz - OBȚINE), transmiterea datelor din formular în cerere.

3. Serverul analizează cererea primită, generează un răspuns, îl trimite către browser și închide conexiunea.

4. Browserul afișează documentul primit de la server.

Trimiterea aceleiași solicitări manual (folosind telnet) arată astfel (presupunând că numele de domeniu al site-ului este www.example.com).

Multe aplicații web folosesc formulare pentru a colecta date și a trimite datele către server. Formularele conțin de obicei mai multe elemente pentru introducerea datelor tipuri variate, cum ar fi numele, adresa, data nașterii Adresa de e-mailși așa mai departe. HTML acceptă mai multe tipuri de elemente de introducere, inclusiv câmpuri de text, butoane radio și casete de selectare. HTML5 a adăugat mai multe elemente speciale, cum ar fi e-mailul, câmpul de parolă, selecția culorilor, widget-uri pentru dată și oră și glisoare.

Exemplul principal al acestui tutorial conține o parte client și o parte server. Partea clientului folosește Polymer pentru a oferi interfața cu utilizatorul(formele conțin multe tipuri de elemente de intrare) și o interfață de sincronizare a datelor cu Dart. Clientul și serverul comunică folosind unele clase din diferite biblioteci, inclusiv fluxuri, fluxuri, HttpRequest și așa mai departe. Serverul folosește anteturi CORS pentru a activa cererile pe mai multe domenii.

cometariu Acest articol se bazează pe ceea ce ați citit în secțiunile: Crearea de elemente personalizate, Utilizarea API-ului Futures, Procesarea dinamică a datelor și ar trebui să vă familiarizați cu biblioteca Polymer, futures, JSON și HttpRequest.

Informații generale despre formulare

Formularele au o proprietate acțiune, care este adresa URL pentru a trimite datele formularului și metodă care determină modul în care trebuie trimise datele. Proprietățile acțiunii și metodei pot fi definite direct în HTML, sau pentru un caz mai complex sau pentru a obține mai mult control, puteți scrie cod Dart și utiliza bibliotecile Dart pentru a expune aceste proprietăți în mod programatic

Să începem cu elementele de bază, doar cu formularele HTML, pentru a înțelege proprietățile de acțiune și metodă ale elementelor de intrare și pentru a înțelege comportamentul standard al formularelor. Formularul de mai jos, inclus într-o etichetă , este folosit pentru a căuta datele introduse de utilizator în Google. Informațiile sunt căutate pe site dacă caseta de selectare este bifată (și pe Internet dacă nu). Acest exemplu, numit search_form, este implicit la căutare resurse utile„carte de bucate” pe dartlang.org.

Iată codul HTML pentru a crea formularul:

Utilizarea atributelor de acțiune și metodă.

Și aici este codul HTML care adaugă trei elemente de intrare în formular - un câmp de text, un buton de trimitere și o casetă de selectare.

Caseta de selectare este înfășurată într-o etichetă de etichetă, așa că puteți da clic atât pe caseta de selectare, cât și pe titlu, pentru a modifica valoarea.

Acest cod HTML oferă un comportament automat.

****

Creează un buton special care, atunci când este apăsat, determină trimiterea datelor din formular. Pe baza atributelor acțiunii și metodei, butonul generează o solicitare și o trimite către server la adresa URL specificată.

**name=q** **name="sitesearch"**

definește numele câmpului de text și numele casetei de selectare.

Pentru elementele dintr-un formular care au un nume specificat, acestea furnizează date pentru formularul respectiv. ÎN în acest exemplu, valoarea furnizată câmp de text aceasta este valoarea pentru q, iar caseta de selectare oferă valoarea pentru cautare site, ambii acești parametri fac parte din adresa URL corectă pentru interogare Google. Când utilizatorul face clic pe butonul, numele și valoarea corespunzătoare sunt adăugate la adresa URL de căutare. Iată un exemplu de cerere:

Http://www.google.com/search?q=Cookbook&sitesearch=dartlang.org

Acest exemplu a fost creat în întregime fără niciun cod Dart sau Javascript. Deoarece este foarte simplu, poate folosi comportamentul normal al HTML: URL-uri accesibile public și ușor de format, precum și o solicitare GET obișnuită. Pentru formularele care conțin un numar mare de date, sau pentru aplicații web, care comunică cu un server specializat, de obicei trebuie să procesați formularul în mod programatic.

Următorul exemplu arată mai multe formă complexă, care trimite în mod programatic date către server folosind o solicitare POST.

Exemplu de slambook în special

Această secțiune include două programe ca exemple de bază.

    Primul este un program de server obișnuit numit slambookserver, care ascultă calculator local portul 4040 și procesează cererile POST și OPȚIUNI prin crearea de mesaje și trimiterea confirmării către client. Serverul folosește anteturi CORS pentru a permite aplicației să utilizeze cererile trimise de la alte servere.

    Al doilea este un program client numit slambook, care oferă un formular în care utilizatorul poate introduce informații. Acest program folosește Polymer pentru legarea dublă a datelor, între elementele de intrare și variabilele Dart. Când utilizatorul face clic pe buton, codul Dart convertește datele într-un șir JSON, trimite o solicitare OPTIONS pentru a obține permisiunea serverului și apoi trimite o solicitare POST pentru a trimite datele. Când se primește o solicitare de la server, aceasta este afișată clientului.

Următoarea diagramă arată secvența comunicării dintre server și client în acest exemplu.


Incearca-l! Introduceți orice date și faceți clic pe butonul Trimite.

Notă de versiune. Aplicația slambook este compatibilă cu polymer.dart 0.9.

Solicitarea returnează mesajul „Fără server” deoarece nu ați pornit serverul pe computer. Să reparăm asta.

Pornirea serverului

Codul sursă al programului de server principal slambookserver.dart poate fi descărcat din exemplele tutorialului

Alerga program server din Linie de comanda

% dart slambookserver.dart Ascultare pentru GET și POST pe http://127.0.0.1:4040

Acum puteți încerca din nou să trimiteți datele din aplicația slambook de mai sus.

cometariu: Dacă un alt program folosește deja portul 4040, serverul va returna un mesaj de eroare și va termina execuția. Programul de pe această pagină se așteaptă ca slambookserver să fie localizat pe mașina locală, portul 4040. Prin urmare, pentru ca aplicația să funcționeze, trebuie să opriți un alt proces și să porniți din nou slambookserver. Sau puteți schimba numărul portului în programul server și client. Evitați să utilizați 3030, deoarece Dart Editor îl folosește. Apoi rulați clientul și serverul pe computerul local.

Restul acestui tutorial explică codul serverului și clientului.

Despre partea client veți afla despre:

    Trimiterea datelor din formular

    Resetare formular

    Utilizarea polimerului pentru a lega datele de formă

Partea de server din această secțiune va vorbi despre:

    Antetele CORS

    Procesarea cererilor OPTIONS

    Gestionarea cererilor POST

Trimiterea datelor din formular

În primul rând, să aruncăm o privire la modul în care datele sunt trimise către server.

Amintiți-vă că exemplul search_form s-a bazat pe utilizarea atributelor acțiune și metodă pentru a specifica scopul și metoda de trimitere a formularului. De asemenea, rețineți că exemplul search_form se bazează pe comportamentul automat al unui buton special de trimitere. Pe de altă parte, exemplul de slambook este implicat direct în procesul de depunere:

    În primul rând, nici acțiunea, nici metoda nu sunt definite în formă

    În al doilea rând, butonul de trimitere are un handler de clic în Dart

    În al treilea rând, gestionarea clicurilor înlocuiește comportamentul automat al butonului de trimitere

    În cele din urmă, datele formularului sunt trimise către server folosind bibliotecile Dart

Forma din exemplul slambook este reprezentată de un element personalizat tute-slambook-form, care este reprezentat de următorul cod HTML:

Observați absența atributelor de acțiune și metodă. În schimb, comportamentul butonului de trimitere este definit în gestionarea de clic pe buton al lui Dart. Mai jos este codul HTML care creează butonul de trimitere și îl leagă de gestionarea Dart.

Și codul în sine pentru manipulatorul de clic pe butonul submitForm():


Să ne uităm la fiecare element al codului de gestionare

Anulați un handler standard

Acesta este un eveniment fără atribute acțiuneȘi metodă, butonul de trimitere conține un comportament automat care nu este necesar în exemplul slambook. Prin urmare, prima linie a codului de gestionare apelează e.preventDefault() pentru a suprascrie comportamentul implicit al butonului.

Void submitForm(Evenimentul e) ( e.preventDefault(); // Nu faceți trimiterea implicită.… )

Configurarea și trimiterea unei cereri POST

Următoarea bucată de cod creează un obiect HttpRequest. Acest cod folosește new pentru a instanția un obiect HttpRequest, care este folosit pentru a configura și trimite o solicitare POST. Clasa HttpRequest are o funcție getString() corespunzătoare, astfel încât să puteți utiliza și trimite solicitări GET obișnuite către adrese URL.

Următoarea linie oferă obiectului HttpRequest o funcție de apel invers numită onData, care este apelat atunci când se primește un răspuns de la server. Ne vom uita la detaliile declarației funcției onData() mai târziu.

Important: Trebuie să înregistrați o funcție de apel invers înainte de a trimite cererea!

Solicitare = HttpRequest nou (); request.onReadyStateChange.listen(onData); var url = "http://127.0.0.1:4040"; request.open("POST", url); request.send(slambookAsJsonData());

În cele din urmă, funcția trimite datele formularului către server ca șir JSON. Uneori datele sunt trimise în părți. Dar acest exemplu este suficient de mic încât datele să fie trimise la un moment dat. Această solicitare este asincronă, deci metoda send() se va finaliza imediat ce cererea este trimisă.

Se așteaptă un răspuns de la server

Obiectul HttpRequest comunică cu serverul. Puteți obține statul folosind câmpul readyState Obiect HttpRequest. Starea gata poate dura cinci sensuri diferite: netrimis (netrimis), deschis (deschis), anteturi primite (anteturi primite), încărcare (încărcare) și finalizat (terminat). Când starea gata se schimbă, HttpRequest generează un eveniment și este apelată funcția de apel invers onData().

Să ne amintim linia de cod în care este înregistrat handlerul de evenimente onReadyStateChange:

Request.onReadyStateChange.listen(onData);

Singurul argument necesar pentru metoda listen() este o funcție de apel invers cu semnătură: void onData(T). Metoda listen() vă permite, de asemenea, să definiți trei argumente suplimentare, cum ar fi un handler de erori.

Mai jos este funcția de apel invers onData():

Void onData(_) ( if (request.readyState == HttpRequest.DONE && request.status == 200) ( // Datele au fost salvate OK. serverResponse = "Server Sez: " + request.responseText; ) else if (request.readyState == HttpRequest.DONE && request.status == 0) ( // Starea este 0... cel mai probabil serverul nu rulează. serverResponse = „Fără server”; ) )

Primul lucru pe care îl arată codul este dacă solicitarea a fost finalizată cu succes. Dacă da, atunci conținutul răspunsului este plasat în rândul numit serverResponse, care este legat de valoarea elementului textarea aplicației slambook. Când o linie este schimbată, interfața cu utilizatorul se va actualiza automat și un mesaj va fi afișat utilizatorului.

Dacă cererea este executată cu o eroare, programul va ieși serverResponse mesaj de eroare care va fi afișat utilizatorului.

Resetarea datelor din formular

Butonul de resetare este element special Intrare HTML, care șterge implicit valorile introduse în acest formular. În schimb, dorim ca butonul să resetați valorile formularului la valorile lor originale. Prin urmare, gestionarea clicurilor pentru butonul de resetare trebuie să înlocuiască comportamentul automat și să completeze în mod explicit datele.

Void resetForm(Eveniment e) ( e.preventDefault(); favoriteThings["pisoi"] = fals; favoriteThings["raindrops"] = fals; favoriteThings["mittens"] = fals; favoriteThings["kittens"] = fals; theData ["firstName"] = ""; theData["favoriteQuote"] = "" theData["favoriteColor"] = "#FFFFFF"] = "2013-01-01"; 0"; theData["catOrDog"] = "pisica"; theData["music"] = 0; theData["zombies"] = false; serverResponse = "Resetarea datelor."; )

Crearea unui backend și ascultarea pe un port

Acum să aruncăm o privire la partea de server, care se numește slambookserver, returnează un răspuns HTTP la o solicitare trimisă de la aplicația client slambook. Codul serverului se bazează pe articolul [Utilizarea Dart pentru a crea servicii web JSON (#)

Serverul ascultă portul 4040 de pe mașina locală și procesează doar cereri precum POST și OPȚIUNI. Ambele tipuri de solicitări folosesc antete CORS pentru a permite accesul. Pentru cererile POST, serverul revine mesaj scurt despre confirmare, care include date în format JSON pe care a primit-o din cerere.

Să aruncăm o privire la cod.

Funcția main() a aplicației slambookserver este prezentată în întregime mai jos. Folosind clasa HttpServer, aplicația slambookserver începe să asculte pe portul 4040 al mașinii locale după apelarea funcției nivel superior lega()

GAZDA finală = "127.0.0.1"; PORT final = 4040; void main() ( HttpServer.bind(HOST, PORT).then(gotMessage, oneError: printError); )

Funcția bind() returnează un viitor care poate fi folosit pentru a obține o valoare în viitor (mai multe informații vor veni în doar un minut). Funcția then() înregistrează două funcții de apel invers ca viitor. Prima funcție, gotMessage(), este apelată atunci când viitorul primește valori. Al doilea printError Apelat atunci când o încercare de conectare eșuează. Poate apărea o eroare, de exemplu, dacă un alt program ascultă deja pe același port.

Filtrați cererile și apelați metodele rămase pentru a gestiona fiecare tip de cerere de funcție gotMessage() mai jos.

Void gotMessage(_server) ( _server.listen((HttpRequest cerere) ( switch (request.method) (case „POST”: handlePost(request); break; case „OPTIONS”: handleOptions(cerere); break; implicit: defaultHandler( cerere);

Pentru a gestiona alte tipuri de solicitări, cum ar fi GET, pur și simplu puteți adăuga mai multe valori la caz De exemplu caz „GET”.

Un pic despre viitor.

Să ne uităm puțin la viitor înainte de a ne uita la codul pentru procesarea solicitărilor POST și OPTIONS.

Un viitor reprezintă o modalitate de a obține o valoare cândva în viitor. Utilizați futures pentru a preveni blocarea unui program în timp ce așteaptă date, de exemplu dacă este necesar un calcul lung pentru a furniza o valoare sau dacă valoarea trebuie citită sau preluată folosind I/O.

Când o funcție care returnează un viitor este apelată, se întâmplă două lucruri

    Funcția este pusă în coadă pentru execuție și returnează imediat un obiect futures incomplet.

    Ulterior, când valoarea este primită, obiectul futures iese cu valoarea primită sau cu o eroare.

Pentru a obține valoarea returnată de viitor, utilizați metoda apoi() pentru a înregistra apelul invers.

În acest exemplu, atât partea client, cât și partea serverului folosesc futures pentru a trimite cereri și a primi răspunsuri corespunzătoare. Programele client-server folosesc aproape întotdeauna futures pentru comunicare și alte tipuri de I/O asincrone.

Gestionarea cererilor de OPȚIUNI

Folosind o clasă HttpRequest, aplicația client slambook trimite solicitări atunci când utilizatorul face clic pe butonul „trimite”. Ai văzut codul mai devreme în acest articol.

Dacă clientul și serverul sunt de origini diferite, ceea ce este obișnuit în aplicații, o solicitare preflight este trimisă înainte de POST. Cererea preliminară trebuie să conțină mai întâi o solicitare OPȚIUNI pentru a determina ce cereri sunt în general permise. Clasa HttpRequest se ocupă automat de solicitările OPTIONS de zbor prealabil. Nu mai este nevoie să scrieți cod la nivelul clientului pentru asta.

Serverul primește o cerere preliminară de OPȚIUNI înainte de a primi cererea principală. Iată codul pentru aplicația slambookserver care procesează cererile OPȚIUNI.

Void handleOptions(HttpRequest req) ( HttpResponse res = req.response; addCorsHeaders(res); print("$(req.method): $(req.uri.path)"); res.statusCode = HttpStatus.NO_CONTENT; res. închide();

Acest cod face următoarele:

    Obține un obiect HttpResponse care are grijă ca serverul să trimită un răspuns către client

    Adaugă anteturi CORS pentru controlul accesului

    Imprimă un mesaj pe consolă

    Semnalează că răspunsul nu are conținut

    Completează răspunsul care va fi trimis clientului.

Când clientul primește o solicitare, antetul CORS semnalează că cererile POST vor fi acceptate.

Configurarea antetelor CORS

Aplicația server folosește următoarea funcție pentru a adăuga anteturi pentru cererile OPTIONS și POST la răspunsul CORS. Funcția adaugă trei anteturi la răspunsul serverului Controlul accesului(care sunt incluse în HttpResponse).

Void addCorsHeaders(HttpResponse res) ( res.headers.add("Acces-Control-Allow-Origin", "*, "); res.headers.add("Access-Control-Allow-Methods", "POST, OPTIONS" ); res.headers.add("Acces-Control-Allow-Headers", "Origine, X-Requested-With, Content-Type, Accept");

Primele două rânduri ale antetului CORS permit solicitări POST și OPTIONS din orice origine. Al treilea determină tipul de solicitări POST și OPȚIUNI pe care serverul le permite să accepte cereri doar cu anumite antete.

Procesarea cererilor POST

Iată o funcție care se ocupă de solicitările clientului POST.

Void handlePost(HttpRequest req) ( HttpResponse res = req.response; print("$(req.method): $(req.uri.path)"); addCorsHeaders(res); req.listen((List buffer) ( // Returnează datele înapoi către client. res.write("Mulțumesc pentru date. Iată ce te-am auzit spunând: "); res.write(new String.fromCharCodes(buffer)); res.close (); onError: printError); )

La fel ca o solicitare OPȚIUNI, slambookserver primește obiectul de răspuns HTTP de la cerere, tipărește un mesaj pe consolă și adaugă anteturi CORS la răspuns.

În continuare, în acest cod, ascultăm datele de la client Solicitare POST. Dacă Toate datele sunt gata, se apelează funcția de apel invers. Această funcție este scrisă în același loc. Argumentul funcției este o listă de numere care include toate datele. Fiecare număr este reprezentat de un cod care poate fi reprezentat ca un caracter UTF-16. Dar nu trebuie să vă faceți griji pentru asta, deoarece puteți apela doar la metoda String.fromCharCodes pentru a converti într-un șir obișnuit.

Obiectul HttpResponse gestionează fluxurile de date pe care serverul le poate folosi pentru a trimite date înapoi către client. În cadrul funcției de apel invers, slambookserver scrie mesaje și date sursă ca șir în acest flux. Serverele mai sofisticate vor face ceva cu aceste date, cum ar fi stocarea lor pe un server, procesarea lor sau poate chiar retragerea banilor din contul dvs. bancar.

Când fluxul este închis, obiectul HttpResponse trimite date către client.

Exemplu aplicație client-server slambook poate servi Punct de start pentru propria dvs. aplicație client-server sau un exemplu despre cum să vă construiți propriile aplicații.

Iată o mostră a ceea ce ar trebui să facă partea client.

    Folosiți formulare pentru a colecta date despre utilizatori.

    Plasați câmpuri de introducere în formulare pentru a elemente individuale date.

    Utilizați polimer pentru părere astfel încât datele din formular să fie sincronizate cu codul Dart.

    Trimiteți date direct (proprietățile formularului de acțiune și metodă)

    Sau programatic (înlocuind comportamentul implicit al codului butonului de trimitere Dart)

    Creați un obiect răspuns pe server dintr-un obiect HttpRequest.

Asta ar trebui să facă serverul.

    Utilizați HttpServer pentru a configura serverul și ascultați pe port.

    Procesează răspunsurile.

    Utilizați antetele CORS pentru a permite fiecare solicitare.

    Răspunsul la cerere folosește HttpResponse.

    Procesați datele în mod asincron folosind futures.

Utilizați fluxuri pentru a scrie date în răspuns.

Aceste resurse se bazează în mare parte pe biblioteci Dart care oferă suport pentru scrierea clienților și serverelor. Vă rugăm să rețineți că există două clase HttpRequest: una în dart:html(pentru clienți) și al doilea dart:io(pentru servere).

Numele dumneavoastră: Adresa ta: Trimite:
ResursăBibliotecăDescriere
HttpRequest dart:html Partea client a solicitării HTTP
HttpRequest dart:io Pe partea de server de solicitare HTTP
HttpServer dart:io Partea server procesează comunicarea HTTP cu serverul
HttpResponse dart:io Partea de server care se ocupă de trimiterea răspunsurilor la cerere
Fluxuri dart:async Flux de date
Viitor dart:async O modalitate de a primi date asincron
JSON dart:convertit Declarație de conversie JSON implicită
Polimer Polimer Date despre elemente personalizate asociate unui șablon

Legare bidirecțională a datelor folosind polimer

Exemplul slambook folosește Polymer pentru feedback, valoarea unui element de intrare cu variabile Dart. Dacă utilizatorul modifică valoarea unui element de intrare, variabila asociată din codul Dart se modifică automat. Sau dacă valoarea se modifică în codul Dart, obiectul element personalizat asociat este actualizat automat. Articolul Definirea elementelor personalizate va oferi mai multe detalii despre legarea datelor și polimer.

Acest exemplu folosește și o declarație de gestionare a evenimentelor pentru a intercepta și procesa funcții pentru elementele de intrare.

Folosind exemplul slambook, puteți lua în considerare utilizarea legăturii de date bidirecționale la diverse elemente intrare, inclusiv noi elemente HTML5. Acest tabel rezumă toate atributele bidirecționale pe care le puteți utiliza cu Polymer:

Utilizarea atributelor valoareîn orice element de intrare

Atribut valoare funcționează asupra oricăror elemente de intrare și asociază o valoare cu un șir Dart. Acest exemplu folosește valoare pentru caseta de bifare, caseta de introducere a textului, selectorul de culori, selectorul de date și selectorul de intervale.


(Rețineți că ceva cod în jur, de exemplu

Un dicționar în cod Dart numit datele conține date de formular. Codul obiectului dicționarului este evidențiat folosind @observabilși apeluri toObservable() pentru legare.

Dicționarul conține perechi cheie/valoare pentru fiecare element de intrare, unde cheia este un șir. Valorile elementelor asociate cu valoare sunt șiruri. HTML se referă la elementele dicționarului folosind numele lor (identificatorii) în Dart. De exemplu, valoarea selectorului de culori este asociată cu theData['favoriteColor'].

Utilizarea selectIndex într-un meniu vertical

Element



În acest exemplu, datele din formular sunt notate atributul numelui(login și parola) vor fi trimise în fișierul de la /example/handler.php. Dacă nu este specificat atributul de acțiune, atunci transferul are loc la adresa paginii curente.

Transferul pe server are loc în două metode diferite: GET și POST, pentru a seta metoda în etichetă

este utilizat atributul metodei, iar valorile sale sunt Cuvinte cheie primiți și postați. Dacă atributul metodei nu este specificat, atunci implicit datele sunt trimise către server folosind metoda GET. În tabel Figura 1 arată diferențele dintre aceste metode.

Ce metodă este utilizată poate fi determinată cu ușurință de bara de adrese a browserului. Dacă în el apare un semn de întrebare și adresa arată astfel, atunci acesta este cu siguranță un GET.

http://www.google.ru/search?q=%D1%81%D0%B8%D1%81%D1%8C%D0%BA%D0%B8&ie=utf-8

O combinație unică de parametri din bara de adrese identifică în mod unic o pagină, astfel încât paginile cu adrese ?q=node/add și ?q=node sunt considerate diferite. Această caracteristică este utilizată de sistemele de management al conținutului (CMS, Sistem de management al conținutului) pentru a crea multe pagini de site. În realitate, se folosește un singur fișier, care primește cerere GET iar conform formează conţinutul documentului.

Mai jos sunt enumerate aplicațiile tipice ale acestor metode pe site-uri.

OBȚINE

Transferarea datelor text mici către server; Cautare site.

Motoarele de căutare și formularele de căutare pe site sunt trimise întotdeauna folosind metoda GET, aceasta vă permite să partajați rezultatele căutării cu prietenii, să trimiteți un link prin poștă sau să-l postați pe un forum.

POST

Transferul de fișiere (fotografii, arhive, programe etc.); trimiterea de comentarii; adăugarea și editarea mesajelor pe forum, blog.

În mod implicit, formularul este procesat în fila curentă a browserului, totuși, atunci când trimiteți formularul, puteți modifica acest parametru și deschide gestionarea formularului într-o filă sau cadru nouă; Acest comportament este specificat prin „numele contextului”, care este valoarea atribut target etichetă . Valorile populare sunt _blank pentru a deschide formularul într-o fereastră sau filă nouă și numele cadrului, care este specificat de atributul nume al etichetei



În acest exemplu, când faceți clic pe butonul Trimitere, rezultatul trimiterii formularului se deschide într-un cadru numit zonă .

Elementele de formular sunt în mod tradițional plasate în interiorul unei etichete

, determinând astfel datele care vor fi transmise către server. În același timp, HTML5 are capacitatea de a separa un formular de elementele sale. Acest lucru se face pentru comoditate și versatilitate, astfel încât un aspect complex poate conține mai multe forme care nu ar trebui să se intersecteze între ele sau, de exemplu, unele elemente sunt afișate folosind scripturi într-un loc pe pagină, iar formularul în sine este situat în altul. . Legătura dintre formular și elementele sale are loc în acest caz prin identificatorul de formular, iar la elemente ar trebui adăugat atributul formular cu o valoare egală cu acest identificator (exemplul 3).

Exemplul 3: Conectarea unui formular la câmpuri

HTML5 IE Cr Op Sa Fx

Formă



În acest exemplu, eticheta

este identificat în mod unic prin identificatorul de autentificare și form="auth" este adăugat la câmpurile care ar trebui trimise prin intermediul formularului. În acest caz, comportamentul elementelor nu se modifică atunci când se face clic pe butonul, login-ul și parola sunt trimise la handler-ul handler.php.

Deși parametrii de transfer de formulare sunt specificați în mod tradițional în etichetă , acestea pot fi transferate și la butoanele de trimitere a formularului (