1 / 45

UN SINGOLO COMPONENTE... ?

UN SINGOLO COMPONENTE... ?. Finora ci siamo concentrati su un singolo programma = un singolo componente si leggono i dati di ingresso ... ... si elabora ( computazione ) ... ... si scrivono i risultati in uscita. Ma oggi quasi mai un’applicazione consi-ste in un singolo componente!

tannar
Download Presentation

UN SINGOLO COMPONENTE... ?

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. UN SINGOLO COMPONENTE... ? • Finora ci siamo concentrati su un singolo programma = un singolo componente • si leggono i dati di ingresso ... • ... si elabora (computazione) ... • ... si scrivono i risultati in uscita. • Ma oggi quasi mai un’applicazione consi-ste in un singolo componente! • un componente acquista molto più valore se può cooperare a creare progetti più grandi • elaborazione distribuita su rete

  2. ARCHITETTURE MULTI-COMPONENTE • componenti software e hardware eterogenei • ogni componente forni-sce servizi agli altri com-ponenti e usa i servizi da essi forniti • necessità di protocolli di comunicazione • esecuzione distribuitanel tempo e nello spazio

  3. ARCHITETTURA CLIENTE / SERVITORE Servitore: • un qualunque ente computazionale capace di nascondere la propria organizzazione interna • presentando ai clienti una precisa interfaccia per lo scambio di informazioni Cliente: • qualunque ente in grado di invocare uno o più servitori per svolgere il proprio compito

  4. IL MODELLO INTERNET Cliente = browser Web • Internet Explorer, Netscape Navigator, ... Servitore = server Web (sul sito) Browser Web(cliente) Server Web rete Internet

  5. IL PROTOCOLLO DI COMUNICAZIONE HTTP:HyperText Transfer Protocol 1) il cliente invia al server l’identificatore dellapagina richiesta (URL) http://www.unibo.it/studenti/stud.html 2) il server recupera il file corrispondente a quella pagina... ..../studenti/stud.html 3) ... e lo invia al cliente (byte per byte)

  6. IL PROTOCOLLO DI COMUNICAZIONE Browser Web(cliente) http://..../studenti/stud.html 1 3 Server Web 2

  7. IL PROTOCOLLO DI COMUNICAZIONE HTTP:HyperText Transfer Protocol Pregio: • è un protocollo molto semplice da gestire e da implementare Difetto: • nella versione base, è poco flessibile • il contenuto delle pagine web è prefissato • il server non fa alcuna elaborazione, si limita a prendere un file e spedirlo

  8. HTTP: ESTENSIONI Obiettivo: • dare al server la possibilità di rispondere a una richiesta in modo “personalizzato” e flessibile(non solo fisso a priori) • esempio: fornire i risultati di una ricerca Come? • rendendo il server capace di eseguire un programma per rispondere alla richiesta. CGI:Common Gateway Interface

  9. HTTP: ESTENSIONI Risultato: • qualunque programma può fornire i suoi servizi sul web • non più solo su un computer isolato! • non importa il linguaggio in cui è scritto • non importa come elabora (computazione) • importa che gestisca input e output nei mo-di previsti dagli standard, ossia che segua il MODELLO DI COORDINAZIONE previsto.

  10. HTTP + CGI Con CGI, HTTP diviene aperto e flessibile: 1) il cliente invia al server l’URL della pagina richiesta, che però non è una vera pagina, ma il nome di un programma (xxxx): http://www.unibo.it/cgi-bin/xxxx 2) il server esegue il programma xxxx... ..../cgi-bin/xxxx 3) ... e invia il risultato al cliente.

  11. HTTP + CGI Browser Web(cliente) http://..../cgi-bin/xxxx 1 Server Web 3 2 Programmaxxxx

  12. HTTP + CGI Quindi: • è il programma che risponde al cliente,non più il server (fa solo da tramite) • tutto quello che il programma scrive sullostandard outputviene trasferito “pari pari” al cliente (il browser Web) • semplice testo, testo HTML, immagini, altro... • si può trasferire di tutto: basta che il cliente sappia come trattare quello che gli arriva.

  13. CGI: UN MINI-ESEMPIO Un programma C che stampa “Hello World”... main(){ printf(“Hello World!”); } ...

  14. CGI: UN MINI-ESEMPIO Fondamentale il “doppio a capo” ... portato “sulla rete”: main(){ printf(“Content-type: text/plain\n\n”); printf(“Hello World!”); } forma standard per avvertire il browser di “cosa gli sta arrivando” (in questo caso testo semplice, senza formattazioni particolari)

  15. MINI-ESEMPIO: VARIANTE Un programma C che stampa “Hello World” come pagina HTML main(){ printf(“Content-type: text/html\n\n”); printf(“<H1>Here we are!</H1>”); printf(“<P><H2>Hello World!</H2>”); fflush(stdout); } Questa volta stiamo inviando testo HTML “doppio a capo” opportuno svuotare il buffer di output per garantire che tutto il testo sia effettivamente inviato

  16. UNA PRECISAZIONE • Questi programmi devono essere compilati come normali programmi da console, non come programmi (pseudo-) grafici! • il server presuppone di poter parlare col programma tramite i normali canali di I/O, non tramite finestre di un qualche tipo! • Quindi, non si può usare il Turbo C! • Occorre DJgpp • o un qualunque compilatore C che produca eseguibili “da linea di comando” (DOS-like)

  17. E PER FARE LE PROVE..? • Non è necessario avere accesso a un ser-ver web situato chissà dove • È possibile installarne uno localmente, sul proprio computer • ce ne sono a decine in rete, molti gratuiti... • ...ma non tutti supportano bene le CGI! • Sul sito del corso trovate Vq Server • un web server scritto in Java (richiede Java per funzionare), molto completo, e gratuito!

  18. HTTP + CGI • Al momento, però, il programma non riceve dati di ingresso, quindi ha un output fisso! • Invece, vogliamo che il cliente (browser) possa inviare al programma opportuni dati di ingresso per guidarne l’elaborazione. Come fare? Due possibili modi: • con il sub-protocollo GET • con il sub-protocollo POST

  19. INVIO DI DATI con GET • Il cliente invia i dati appendendoli all’URL • un punto interrogativo come separatore iniziale • seguito da qualunque cosa, ma senza spazi! http://www.unibo.it/cgi-bin/xxxx?dati • il server pone tutto ciò che segue il ? nella variabile di ambiente QUERY_STRING • il programma può recuperarla con la funzione di libreria getenv()[in stdlib]: char *s = getenv("QUERY_STRING")

  20. ESEMPIO Un programma C che ristampa quello che ri- ceve (eco): main(){ char *st = getenv("QUERY_STRING"); printf(“Content-type: text/plain\n\n”); printf(“Buongiorno %s !”, st); fflush(stdout); } Ricordare il “doppio a capo” ristampa la stringa st che ha ricevuto

  21. ESEMPIO Il browser può invocarlo ad esempio così: L’URL ha la forma:.../cgi-bin/....../cgi/.... ristampa la stringa che ha ricevuto

  22. UNA RIFLESSIONE SULL’ESEMPIO • Certo, questo esempio è estremamente banale, perfino inutile... • ..ma dimostra che “portare un programma sul Web” è semplicissimo basta rispettare il modello di coordinazione previsto dallo standard (qui, CGI) • Anche un programma che da solo sarebbe stato di modesta utilità, portato sul Web può essere utile ad altri • diventa accessibile da tutto il mondo!

  23. I MODULI (FORM) • In pratica, nessuno si sogna di scrivere i dati nell’URL “a mano” • Tipicamente, l’utente compila un modulo grafico e preme un bottoneper inviare i dati UN “FORM” scritto in HTML • Il risultato è che il cliente (browser): • prepara la stringa dati da inviare • la appende al ? nel modo previsto

  24. I MODULI (FORM) Qui si scrive il testo da inviare al programma Quando si preme il bottone, il testo viene inviato

  25. MODULI... E RISULTATI La stringa inviata ha una forma particolare:Campo=Valore Riscrive esattamente la stringa ricevuta

  26. RISULTATI... E MODULI Questo campo di testo si chiamava testo Perciò, la stringa inviata è statatesto=PaolinoPaperino Il testo scritto era PaolinoPaperino

  27. IL MODULO (HTML) <TITLE> Esempio di form </TITLE> <H1> Esempio di form </H1> <FORM METHOD="GET"ACTION="http://localhost/cgi/enrico/prova0.exe" > Inserisci il testo:<INPUT NAME="testo"> e poi premi invio:<INPUT TYPE="submit" VALUE="invio"> </FORM> Protocollo GET Azione da compie-re quando si preme il pulsante invio

  28. IL MODULO (HTML) <TITLE> Esempio di form </TITLE> <H1> Esempio di form </H1> <FORM METHOD="GET"ACTION="http://localhost/cgi/enrico/prova0.exe" > Inserisci il testo:<INPUT NAME="testo"> e poi premi invio:<INPUT TYPE="submit" VALUE="invio"> </FORM> Il campo di testo (di nome testo) Il pulsante che attiva l’azione (tipo submit), chiamato invio nel modulo

  29. INVIO DI DATI CON I MODULI • Dunque, quando si compila un modulo, la stringa inviata al programma (con GET) ha sempre la forma standard seguente: ...?nome1=valore1&nome2=valore2&... dove • nome1,nome2, ... sono i nomi dei campi (di testo, di selezione,...) • valore1,valore2, ... sono i testi effetti-vamente scritti nei rispettivi campi

  30. UN MODULO PIÙ COMPLESSO Due campi di testo, deno-minati rispettivamente Nome e Cognome Due pulsanti, chiamati conferma e annulla(il primo invia, il secondo cancella il modulo)

  31. IL RISULTATO La stringa inviata ha la forma standardNome=Paolino&Cognome=Paperino

  32. IL MODULO PIÙ COMPLESSO (HTML) Un diverso programma <H1> Esempio di form </H1> <FORM METHOD="GET" ACTION="http://localhost/cgi/prova1.exe" > Inserire i seguenti dati:<p> Inserire il nome: <INPUT NAME="Nome"><br> Inserire il cognome: <INPUT NAME="Cognome"> <p> <INPUT TYPE="submit" VALUE="conferma"> <INPUT TYPE="reset" VALUE="annulla"> </FORM> i due campi di testo i due pulsanti (il tipo submit invia, il tipo reset cancella il modulo)

  33. IL PROGRAMMA Il programma riceve una stringa in forma standard e deve estrarre i vari pezzi main(){ char cognome[80], nome[80], *st; printf("Content-type: text/plain\n\n"); st = getenv("QUERY_STRING"); estrai(st, "Nome", nome); estrai(st, "Cognome", cognome); printf("Buongiorno %s %s!\n\n", nome, cognome); } I nomi dei campi di testo del modulo (attenzione: devono essere identici!)

  34. IL PROGRAMMA La funzione estrai(char*, char*, char*) int estrai(char s[], char parametro[], char valore[]) { const char separatore = '&'; char *fine, *pos = strstr(s,parametro); if (pos==NULL) return 1; /* non c’è */ pos += strlen(parametro)+1; fine = strchr(pos,separatore); if (fine==NULL) fine = pos + strlen(pos); strncpy(valore,pos,fine-pos); valore[fine-pos]='\0'; return 0; }

  35. IL PROGRAMMA La funzione estrai(char*, char*, char*) int estrai(char s[], char parametro[], char valore[]) { const char separatore = '&'; char *fine, *pos = strstr(s,parametro); if (pos==NULL) return 1; /* non c’è */ pos += strlen(parametro)+1; fine = strchr(pos,separatore); if (fine==NULL) fine = pos + strlen(pos); strncpy(valore,pos,fine-pos); valore[fine-pos]='\0'; return 0; } parametro=valoreci si posiziona dopo l’= parametro=valore&si cerca l’& finale (se c’è) finalmente si ricopia in valore il pezzo che serve se l’& finale non c’è, si prende fino a fine stringa

  36. Da GET a POST • Finora, per inviare dati al programma CGI abbiamo sfruttato il sub-protocollo GET • Pro: è semplice, è facile da gestire • Contro: è inadatto a inviare molti dati (la varia-bile QUERY_STRING ha limiti di lunghezza) • Questi limiti si superano con ilsub-proto-collo POST • i dati sono inviati sullo standard input del programma • richiede obbligatoriamente un modulo (form) per inviare i dati (non si possono appendere all’URL)

  37. INVIO DI DATI con POST • È indispensabile usare un modulo (form) • Quando si preme il pulsante di invio, il browser invia i dati al server... • .. che li ridirige sul canale d’input standard del programma • i dati si possono quindi recuperare con normali letture da input • non si passa più dalle variabili di ambiente del sistema operativo, quindi non ci sono limiti di dimensione

  38. INVIO DI DATI con POST Quale formato usa POST per inviare i dati? • di norma, usa lo stesso formato di GET: nome1=valore1&nome2=valore2&... • Se però si specifica un particolare tipo di codifica (enctype), il browser usa quello • Ad esempio, con enctype="multipart/form-data”il browser invia i dati su righe separate, uno per riga, separati da righe speciali e righe vuote.

  39. LO STESSO MODULO DI POCO FA Due campi di testo, deno-minati rispettivamente Nome e Cognome Due pulsanti, chiamati conferma e annulla(il primo invia, il secondo cancella il modulo)

  40. ...CHE USA POST (CASO BASE) Un terzo programma <H1> Esempio di form </H1> <FORM METHOD="POST" ACTION="http://localhost/cgi/prova2.exe" > Inserire i seguenti dati:<p> Inserire il nome: <INPUT NAME="Nome"><br> Inserire il cognome: <INPUT NAME="Cognome"> <p> <INPUT TYPE="submit" VALUE="conferma"> <INPUT TYPE="reset" VALUE="annulla"> </FORM>

  41. IL PROGRAMMA Il programma fa l’eco di tutto ciò che riceve: main(){ char buf[1024]; printf("Content-type: text/plain\n\n"); printf("Risposta:\n\n"); while(gets(buf)) printf("%s\n", buf); } Ipotesi: righe non più lunghe di 1024 caratteri

  42. IL RISULTATO (NEL CASO BASE) Niente più dati appesi all’URL La stringa inviata ha la forma standardNome=Paolino&Cognome=Paperino

  43. IL POST “multipart/form-data” Lo stesso programma <H1> Esempio di form </H1> <FORM METHOD="POST" ACTION="http://localhost/cgi/prova2.exe" enctype="multipart/form-data"> Inserire i seguenti dati:<p> Inserire il nome: <INPUT NAME="Nome"><br> Inserire il cognome: <INPUT NAME="Cognome"> <p> <INPUT TYPE="submit" VALUE="conferma"> <INPUT TYPE="reset" VALUE="annulla"> </FORM> Una diversa codifica

  44. ... E IL DIVERSO RISULTATO I dati sono inviati uno per riga, separati da righe speciali e da una riga vuota

  45. IL CODICE FISCALE.. SUL WEB!! Ricordate l’esercizio sul codice fiscale? • una delle varianti prevedeva proprio il formato di dati tipico di GET e POST (caso base) • adottando tale formato di input, il program-ma può essere “portato sul Web” senza sforzo... • ...e immediatamente un servizio importante risulta disponibile a tutti!

More Related