Programare Web De la CGI la servere de aplicatii Dr. Sabin-Corneliu Buraga Facultatea de Informatica Universitatea “A.I.Cuza” – Iasi, Romania http://www.infoiasi.ro/~busaco/
Standardul CGI  Alternative Caracteristici comune  ale serverelor de aplicatii Web cuprins
Standardul CGI   Caracterizare Variabile de mediu Invocarea scripturilor CGI SSI ( Server Side Includes ) cuprins
Standard de facto pentru interactiunea programatica a clientilor cu serverele Web –  CGI/1.1 Scop: generarea dinamica pe server de reprezentari ale unor resurse solicitate de un client Web Un program ( script ) CGI  se invoca pe server ,  in mod implicit sau explicit  ( i.e. , preluarea informatiilor dintr-un formular) Scripturile CGI pot fi concepute  in  orice  limbaj disponibil pe server Limbaje interpretate:  bash, Perl (modulul CGI), Python, Pike, Ruby,... Limbaje compilate: C, C++,... cgi | caracterizare
Un script CGI scrie datele  la iesirea standard ( stdout ) Un  script  CGI genereaza/foloseste anteturi HTTP, utilizind standardul MIME  – exemplu:  Content-type: text/html Unui program CGI, datele de procesat  i se vor trimite la intrarea standard sau  prin intermediul unor variabile de mediu Detalii:  http://hoohoo.ncsa.uiuc.edu/cgi cgi | programe
Interactiunea dintre clientul si serverul Web cgi | programe
Un program CGI are acces  la variabilele de mediu: Independente de cerere: SERVER_NAME ,  GATEWAY_INTERFACE Specifice cererilor transmise spre  script -ul CGI: SERVER_PROTOCOL ,   REQUEST_METHOD ,   QUERY_STRING ,   REMOTE_HOST ,   REMOTE_ADDR ,   CONTENT_TYPE ,   CONTENT_LENGTH cgi | variabile/1
Variabile suplimentare (generate de serverul Web):  HTTP_ACCEPT ,  HTTP_USER_AGENT ,...  Script  CGI care afiseaza variabilele de mediu: #!/usr/bin/perl  # Afiseaza mediul  print " Content-type: text/plain \n\n ";  print "Environment:\n\n";  foreach $key (keys %ENV) {    printf "%16s = %s\n", $key, $ENV{$key};  }  cgi | variabile/2 variabile.cgi cu drepturi de  citire  &  executie
#!/bin/bash echo “ Content-type: text/html ” echo echo “<p>Salut din CGI!</p>” Invocare directa (prin GET): http://domeniu/~utilizator/cale/salut.cgi cgi | invocare/1 salut.cgi stocat in  ~/html/cale De experimentat si  alte tipuri MIME ( text/plain ,  text/xml )
< form   action =&quot; http://www.infoiasi.ro/ cgi-bin/max.cgi &quot; method =&quot;GET&quot; >  <p>Va rugam, introduceti doua numere: < input type=&quot;text&quot;  name=&quot;nr1&quot; size=&quot;5&quot; />  < input   type=&quot;text&quot;  name=&quot;nr2&quot; size=&quot;5&quot; /> </p> <p>< input   type=&quot;submit&quot;  value=&quot;Afla maximul&quot; /></p> < /form >   Invocare dintr-un formular interactiv  (GET sau POST) cgi | invocare/2
cgi | invocare/3 URL special (cazul GET)
Pentru fiecare cimp al formularului, se genereaza  o pereche  nume_cimp=valoare  delimitata de  &   care va fi adaugata URL-ului unde este stocat programul CGI: http://www.infoiasi.ro/cgi-bin/max.cgi ? nr1 = 7 & nr2 = 4 Acest URL este codificat ( %hexa , spatiul devine  + )  –  URL encoding  (vezi cursul anterior) Serverul va invoca scriptul CGI pasindu-i datele  la intrarea standard sau via variabile de mediu   cgi | invocare/4
Procesarea datelor prin metoda GET Datele vor fi disponibile in variabila  QUERY_STRING printf (“ Content-type: text/html\n\n ”); … data =  getenv  (“ QUERY_STRING ”);  /* preia variabila de mediu */ sscanf (data, “nr1=%ld&nr2=%ld”, &nr1, &nr2); … printf (“<p>Maximul dintre %ld si %ld este …</p>”,…); cgi | invocare/5
Procesarea datelor prin metoda POST Datele vor fi accesate de la intrarea standard ( stdin ), lungimea in octeti a datelor primite  fiind stocata in variabila  CONTENT_LENGTH printf (“ Content-type: text/html\n\n ”); … lenstr =  getenv  (“ CONTENT_LENGTH ”); sscanf (lenstr, “%ld”, &len); fgets (data, len+1, stdin);  /* citim de la intrarea standard */ … printf (“<p>Maximul dintre %ld si %ld este …</p>”,…); cgi | invocare/6
Metoda GET se foloseste pentru generarea de  reprezentari ale resurselor cerute  (starea serverului nu trebuie sa se modifice) Metoda POST se utilizeaza atunci cind datele transmise serverului au dimensiuni mari  (continut de fisiere) sau sint “delicate” ( e.g. , parole);  de asemenea, cind invocarea scriptului  poate conduce la modificari ale starii pe server  (adaugarea unei inregistrari, alterarea unui fisier,...) Folosind GET, se poate stabili un “ bookmark ” pentru acces ulterior la o resursa Web cgi | GET  vs.  POST
Scop: posibilitatea executiei scripturilor CGI  si a altor actiuni, direct din pagina Web Comenzi (directive) SSI:  <!--# directiva  -->   Fisierele continind directive SSI in mod uzual au extensia  .shtml server side includes
Comenzi uzuale: echo  – afiseaza valoarea anumitor variabile   <p>Data si timpul:    <!--# echo  var= &quot; DATE_LOCAL &quot; --></p> <p>Legătura prin care s-a ajuns aici este    <!--# echo  var=&quot; HTTP_REFERER &quot; --></p> <p>Numele acestui document este    <!--# echo  var=&quot; DOCUMENT_NAME &quot; --></p> fsize  – furnizeaza marimea unui fisier <!--# fsize  file=&quot; index.html &quot; --> server side includes
Comenzi uzuale: flastmod  – ofera data ultimei modificari  a unui fisier (aflat pe serverul Web) <p>Ultima modificare: <!--# flastmod  file= &quot; web.html &quot;  --></p> exec  –  executa un script CGI (nu-i permisa la IIS) <!--# exec  cgi= &quot; citat.pl.cgi &quot;  --> include  – include un fisier <!--# include  file= &quot; antet.html.inc &quot;  --> server side includes Atentie la problemele de securitate ce pot aparea!
Folosirea altor interfete de programare Web pe partea de server  mod_perl  (Apache) NSAPI  ( Netscape Server API ) ISAPI  ( Microsoft Internet Services API ) Servere de aplicatii Web – reprezentative: ASP ( Active Server Pages ) .NET JSP ( Java Server Pages )  PHP ( PHP: Hypertext Preprocessor ) Ruby on Rails alternative
Caracteristici comune  ale serverelor de aplicatii Web Caracterizare Comparatii privind facilitatile oferite cuprins
Ofera posibilitatea de a include cod ( script ) direct in cadrul documentelor Web, cod invocat pe server    generarea de continut dinamic pe partea de server Maniera de includere depinde  de serverul de aplicatii Web: <% ... %>  pentru ASP / ASP.NET <% ... %>  pentru JSP ( Java Server Pages ) <?php ... ?>  pentru PHP Mai general:  <script language=“...”>...</script> servere de aplicatii
Beneficiaza de facilitatile oferite de cadrul de lucru pus la dispozitie de serverul de aplicatii Limbaj(e) de programare API-ul de baza Suport pentru baze de date Suport pentru interactiunea Web Suport pentru  cookie -uri & sesiuni  Suport pentru procesari speciale ( e.g. , XML) Medii de dezvoltare Alte facilitati particulare servere de aplicatii
Beneficiaza de facilitatile oferite de cadrul de lucru pus la dispozitie de serverul de aplicatii Limbaj(e) de programare  VBScript & JScript (ASP) limbajele .NET (ASP.NET)    ASP.NET este independent de limbaj,  fiind parte a  .NET Framework Java ( servlet -uri, JSP) Python (Zope) Ruby (Ruby on Rails) altele servere de aplicatii
Beneficiaza de facilitatile oferite de cadrul de lucru pus la dispozitie de serverul de aplicatii Limbaj(e) de programare  Strong typed   vs.   weak typed   (ASP.NET/JSP  vs.  ASP/PHP) Utilizare de spatii de nume si instante de clase Raportare de erori (ASP, PHP4)  vs.   exceptii (ASP.NET, JSP, PHP5) Pur obiectuale (ASP.NET, JSP) sau nu (PHP) Interpretate sau compilate (de cele mai multe ori,  se prefera generarea de cod intermediar – IL) servere de aplicatii
Beneficiaza de facilitatile oferite de cadrul de lucru pus la dispozitie de serverul de aplicatii API-ul de baza Utilizarea “puterii” limbajului si  framework -ului (functii/clase predefinite)    migrare facila de la aplicatii clasice la cele Web   securitate, consistenta, acces la resursele mediului Se poate asigura si independenta de platforma PHP Built-in functions   vs.  ASP.NET CLR ( Common Language Runtime ) – aceeasi comparatie si la JSP Functionalitatile incluse in API-ul de baza  nu necesita recompilarea serverului de aplicatii servere de aplicatii
Beneficiaza de facilitatile oferite de cadrul de lucru pus la dispozitie de serverul de aplicatii Suport pentru baze de date Acces robust la servere de baze de date ADO.NET  pentru ASP.NET JDBC  ( Java DataBase Connectivity ) pentru JSP Functii PHP predefinite pentru o pleiada de RDBMS, via biblioteci incorporate ( SQLite  si  mysqli  in PHP5) sau extensii; se poate utiliza si interfata ODBC “ Legarea” datelor de program ( data binding )  este realizata automat (ASP.NET) sau manual (PHP) Eventual, se pot folosi  framework -uri aditionale  ( e.g. , Hibernate – Java) servere de aplicatii
Beneficiaza de facilitatile oferite de cadrul de lucru pus la dispozitie de serverul de aplicatii Suport pentru interactiunea Web Controale Web disponibile pe server,  fie emulind cimpurile din formularele (X)HTML,  fie oferind controale noi ( e.g. , calendar)    generarea de cod HTML (+JavaScript) in functie de client ASP.NET ( <asp:control> ), PHP 5 via PRADO similar, pentru platforma Java Procesarea evenimentelor provenind de la client (ASP.NET) –  event driven Web applications Transferuri asincrone prin AJAX  (module/clase aditionale) servere de aplicatii
Beneficiaza de facilitatile oferite de cadrul de lucru pus la dispozitie de serverul de aplicatii Medii de dezvoltare Unele, foarte sofisticate Comerciale (Delphi, Visual Studio .NET, JBuilder, Zend,...), gratuite (Kylix, IBM Eclipse, WebMatrix),  de evaluare/educationale (Visual Studio Express,...) Depanatoare, optimizatoare de cod  ( e.g. , Zend Optimizer),  profilers  etc. Facilitati pentru dezvoltatorii de servicii Web Clase/componente/biblioteci aditionale  (comerciale ori gratuite) servere de aplicatii
Beneficiaza de facilitatile oferite de cadrul de lucru pus la dispozitie de serverul de aplicatii Suport acordat inginerilor software Aplicatii  N -tier Unele  framework -uri incurajeaza folosirea sabloanelor de proiectare ( design patterns ):  MVC ( Model-View-Controller )  –  e.g. , Ruby on Rails  Unitati de testare automata (JUnit, PHP Unit,...) Generarea automata de documentatii,  in diverse formate Suport pentru  versioning  (CVS, Subversion,…) Pot folosi o paradigma ( e.g. ,  agile programming ) servere de aplicatii
Beneficiaza de facilitatile oferite de cadrul de lucru pus la dispozitie de serverul de aplicatii Alte facilitati Suport pentru dezvoltarea de aplicatii Web complexe Aplicatiile Web pot folosi containere de componente Arhitecturi orientate spre servicii  (SOA –  Service Oriented Architecture ) Suport pentru arhitecturi/platforme avansate  de tip  enterprise  ( e.g. ,  Grid ) servere de aplicatii
Standardul CGI  Alternative Caracteristici comune  ale serverelor de aplicatii Web rezumat
Intrebari…?

Programare Web - De la CGI la servere de aplicatii

  • 1.
    Programare Web Dela CGI la servere de aplicatii Dr. Sabin-Corneliu Buraga Facultatea de Informatica Universitatea “A.I.Cuza” – Iasi, Romania http://www.infoiasi.ro/~busaco/
  • 2.
    Standardul CGI Alternative Caracteristici comune ale serverelor de aplicatii Web cuprins
  • 3.
    Standardul CGI Caracterizare Variabile de mediu Invocarea scripturilor CGI SSI ( Server Side Includes ) cuprins
  • 4.
    Standard de factopentru interactiunea programatica a clientilor cu serverele Web – CGI/1.1 Scop: generarea dinamica pe server de reprezentari ale unor resurse solicitate de un client Web Un program ( script ) CGI se invoca pe server , in mod implicit sau explicit ( i.e. , preluarea informatiilor dintr-un formular) Scripturile CGI pot fi concepute in orice limbaj disponibil pe server Limbaje interpretate: bash, Perl (modulul CGI), Python, Pike, Ruby,... Limbaje compilate: C, C++,... cgi | caracterizare
  • 5.
    Un script CGIscrie datele la iesirea standard ( stdout ) Un script CGI genereaza/foloseste anteturi HTTP, utilizind standardul MIME – exemplu: Content-type: text/html Unui program CGI, datele de procesat i se vor trimite la intrarea standard sau prin intermediul unor variabile de mediu Detalii: http://hoohoo.ncsa.uiuc.edu/cgi cgi | programe
  • 6.
    Interactiunea dintre clientulsi serverul Web cgi | programe
  • 7.
    Un program CGIare acces la variabilele de mediu: Independente de cerere: SERVER_NAME , GATEWAY_INTERFACE Specifice cererilor transmise spre script -ul CGI: SERVER_PROTOCOL , REQUEST_METHOD , QUERY_STRING , REMOTE_HOST , REMOTE_ADDR , CONTENT_TYPE , CONTENT_LENGTH cgi | variabile/1
  • 8.
    Variabile suplimentare (generatede serverul Web): HTTP_ACCEPT , HTTP_USER_AGENT ,... Script CGI care afiseaza variabilele de mediu: #!/usr/bin/perl # Afiseaza mediul print &quot; Content-type: text/plain \n\n &quot;; print &quot;Environment:\n\n&quot;; foreach $key (keys %ENV) { printf &quot;%16s = %s\n&quot;, $key, $ENV{$key}; } cgi | variabile/2 variabile.cgi cu drepturi de citire & executie
  • 9.
    #!/bin/bash echo “Content-type: text/html ” echo echo “<p>Salut din CGI!</p>” Invocare directa (prin GET): http://domeniu/~utilizator/cale/salut.cgi cgi | invocare/1 salut.cgi stocat in ~/html/cale De experimentat si alte tipuri MIME ( text/plain , text/xml )
  • 10.
    < form action =&quot; http://www.infoiasi.ro/ cgi-bin/max.cgi &quot; method =&quot;GET&quot; > <p>Va rugam, introduceti doua numere: < input type=&quot;text&quot; name=&quot;nr1&quot; size=&quot;5&quot; /> < input type=&quot;text&quot; name=&quot;nr2&quot; size=&quot;5&quot; /> </p> <p>< input type=&quot;submit&quot; value=&quot;Afla maximul&quot; /></p> < /form > Invocare dintr-un formular interactiv (GET sau POST) cgi | invocare/2
  • 11.
    cgi | invocare/3URL special (cazul GET)
  • 12.
    Pentru fiecare cimpal formularului, se genereaza o pereche nume_cimp=valoare delimitata de & care va fi adaugata URL-ului unde este stocat programul CGI: http://www.infoiasi.ro/cgi-bin/max.cgi ? nr1 = 7 & nr2 = 4 Acest URL este codificat ( %hexa , spatiul devine + ) – URL encoding (vezi cursul anterior) Serverul va invoca scriptul CGI pasindu-i datele la intrarea standard sau via variabile de mediu cgi | invocare/4
  • 13.
    Procesarea datelor prinmetoda GET Datele vor fi disponibile in variabila QUERY_STRING printf (“ Content-type: text/html\n\n ”); … data = getenv (“ QUERY_STRING ”); /* preia variabila de mediu */ sscanf (data, “nr1=%ld&nr2=%ld”, &nr1, &nr2); … printf (“<p>Maximul dintre %ld si %ld este …</p>”,…); cgi | invocare/5
  • 14.
    Procesarea datelor prinmetoda POST Datele vor fi accesate de la intrarea standard ( stdin ), lungimea in octeti a datelor primite fiind stocata in variabila CONTENT_LENGTH printf (“ Content-type: text/html\n\n ”); … lenstr = getenv (“ CONTENT_LENGTH ”); sscanf (lenstr, “%ld”, &len); fgets (data, len+1, stdin); /* citim de la intrarea standard */ … printf (“<p>Maximul dintre %ld si %ld este …</p>”,…); cgi | invocare/6
  • 15.
    Metoda GET sefoloseste pentru generarea de reprezentari ale resurselor cerute (starea serverului nu trebuie sa se modifice) Metoda POST se utilizeaza atunci cind datele transmise serverului au dimensiuni mari (continut de fisiere) sau sint “delicate” ( e.g. , parole); de asemenea, cind invocarea scriptului poate conduce la modificari ale starii pe server (adaugarea unei inregistrari, alterarea unui fisier,...) Folosind GET, se poate stabili un “ bookmark ” pentru acces ulterior la o resursa Web cgi | GET vs. POST
  • 16.
    Scop: posibilitatea executieiscripturilor CGI si a altor actiuni, direct din pagina Web Comenzi (directive) SSI: <!--# directiva --> Fisierele continind directive SSI in mod uzual au extensia .shtml server side includes
  • 17.
    Comenzi uzuale: echo – afiseaza valoarea anumitor variabile <p>Data si timpul: <!--# echo var= &quot; DATE_LOCAL &quot; --></p> <p>Legătura prin care s-a ajuns aici este <!--# echo var=&quot; HTTP_REFERER &quot; --></p> <p>Numele acestui document este <!--# echo var=&quot; DOCUMENT_NAME &quot; --></p> fsize – furnizeaza marimea unui fisier <!--# fsize file=&quot; index.html &quot; --> server side includes
  • 18.
    Comenzi uzuale: flastmod – ofera data ultimei modificari a unui fisier (aflat pe serverul Web) <p>Ultima modificare: <!--# flastmod file= &quot; web.html &quot; --></p> exec – executa un script CGI (nu-i permisa la IIS) <!--# exec cgi= &quot; citat.pl.cgi &quot; --> include – include un fisier <!--# include file= &quot; antet.html.inc &quot; --> server side includes Atentie la problemele de securitate ce pot aparea!
  • 19.
    Folosirea altor interfetede programare Web pe partea de server mod_perl (Apache) NSAPI ( Netscape Server API ) ISAPI ( Microsoft Internet Services API ) Servere de aplicatii Web – reprezentative: ASP ( Active Server Pages ) .NET JSP ( Java Server Pages ) PHP ( PHP: Hypertext Preprocessor ) Ruby on Rails alternative
  • 20.
    Caracteristici comune ale serverelor de aplicatii Web Caracterizare Comparatii privind facilitatile oferite cuprins
  • 21.
    Ofera posibilitatea dea include cod ( script ) direct in cadrul documentelor Web, cod invocat pe server  generarea de continut dinamic pe partea de server Maniera de includere depinde de serverul de aplicatii Web: <% ... %> pentru ASP / ASP.NET <% ... %> pentru JSP ( Java Server Pages ) <?php ... ?> pentru PHP Mai general: <script language=“...”>...</script> servere de aplicatii
  • 22.
    Beneficiaza de facilitatileoferite de cadrul de lucru pus la dispozitie de serverul de aplicatii Limbaj(e) de programare API-ul de baza Suport pentru baze de date Suport pentru interactiunea Web Suport pentru cookie -uri & sesiuni Suport pentru procesari speciale ( e.g. , XML) Medii de dezvoltare Alte facilitati particulare servere de aplicatii
  • 23.
    Beneficiaza de facilitatileoferite de cadrul de lucru pus la dispozitie de serverul de aplicatii Limbaj(e) de programare VBScript & JScript (ASP) limbajele .NET (ASP.NET)  ASP.NET este independent de limbaj, fiind parte a .NET Framework Java ( servlet -uri, JSP) Python (Zope) Ruby (Ruby on Rails) altele servere de aplicatii
  • 24.
    Beneficiaza de facilitatileoferite de cadrul de lucru pus la dispozitie de serverul de aplicatii Limbaj(e) de programare Strong typed vs. weak typed (ASP.NET/JSP vs. ASP/PHP) Utilizare de spatii de nume si instante de clase Raportare de erori (ASP, PHP4) vs. exceptii (ASP.NET, JSP, PHP5) Pur obiectuale (ASP.NET, JSP) sau nu (PHP) Interpretate sau compilate (de cele mai multe ori, se prefera generarea de cod intermediar – IL) servere de aplicatii
  • 25.
    Beneficiaza de facilitatileoferite de cadrul de lucru pus la dispozitie de serverul de aplicatii API-ul de baza Utilizarea “puterii” limbajului si framework -ului (functii/clase predefinite)  migrare facila de la aplicatii clasice la cele Web  securitate, consistenta, acces la resursele mediului Se poate asigura si independenta de platforma PHP Built-in functions vs. ASP.NET CLR ( Common Language Runtime ) – aceeasi comparatie si la JSP Functionalitatile incluse in API-ul de baza nu necesita recompilarea serverului de aplicatii servere de aplicatii
  • 26.
    Beneficiaza de facilitatileoferite de cadrul de lucru pus la dispozitie de serverul de aplicatii Suport pentru baze de date Acces robust la servere de baze de date ADO.NET pentru ASP.NET JDBC ( Java DataBase Connectivity ) pentru JSP Functii PHP predefinite pentru o pleiada de RDBMS, via biblioteci incorporate ( SQLite si mysqli in PHP5) sau extensii; se poate utiliza si interfata ODBC “ Legarea” datelor de program ( data binding ) este realizata automat (ASP.NET) sau manual (PHP) Eventual, se pot folosi framework -uri aditionale ( e.g. , Hibernate – Java) servere de aplicatii
  • 27.
    Beneficiaza de facilitatileoferite de cadrul de lucru pus la dispozitie de serverul de aplicatii Suport pentru interactiunea Web Controale Web disponibile pe server, fie emulind cimpurile din formularele (X)HTML, fie oferind controale noi ( e.g. , calendar)  generarea de cod HTML (+JavaScript) in functie de client ASP.NET ( <asp:control> ), PHP 5 via PRADO similar, pentru platforma Java Procesarea evenimentelor provenind de la client (ASP.NET) – event driven Web applications Transferuri asincrone prin AJAX (module/clase aditionale) servere de aplicatii
  • 28.
    Beneficiaza de facilitatileoferite de cadrul de lucru pus la dispozitie de serverul de aplicatii Medii de dezvoltare Unele, foarte sofisticate Comerciale (Delphi, Visual Studio .NET, JBuilder, Zend,...), gratuite (Kylix, IBM Eclipse, WebMatrix), de evaluare/educationale (Visual Studio Express,...) Depanatoare, optimizatoare de cod ( e.g. , Zend Optimizer), profilers etc. Facilitati pentru dezvoltatorii de servicii Web Clase/componente/biblioteci aditionale (comerciale ori gratuite) servere de aplicatii
  • 29.
    Beneficiaza de facilitatileoferite de cadrul de lucru pus la dispozitie de serverul de aplicatii Suport acordat inginerilor software Aplicatii N -tier Unele framework -uri incurajeaza folosirea sabloanelor de proiectare ( design patterns ): MVC ( Model-View-Controller ) – e.g. , Ruby on Rails Unitati de testare automata (JUnit, PHP Unit,...) Generarea automata de documentatii, in diverse formate Suport pentru versioning (CVS, Subversion,…) Pot folosi o paradigma ( e.g. , agile programming ) servere de aplicatii
  • 30.
    Beneficiaza de facilitatileoferite de cadrul de lucru pus la dispozitie de serverul de aplicatii Alte facilitati Suport pentru dezvoltarea de aplicatii Web complexe Aplicatiile Web pot folosi containere de componente Arhitecturi orientate spre servicii (SOA – Service Oriented Architecture ) Suport pentru arhitecturi/platforme avansate de tip enterprise ( e.g. , Grid ) servere de aplicatii
  • 31.
    Standardul CGI Alternative Caracteristici comune ale serverelor de aplicatii Web rezumat
  • 32.