La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

UN SINGOLO COMPONENTE... ? Finora ci siamo concentrati su un singolo programma = un singolo componente –si leggono i dati di ingresso... –... si elabora.

Presentazioni simili


Presentazione sul tema: "UN SINGOLO COMPONENTE... ? Finora ci siamo concentrati su un singolo programma = un singolo componente –si leggono i dati di ingresso... –... si elabora."— Transcript della presentazione:

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 distribuita nel tempo e nello spazio

3 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 ARCHITETTURA CLIENTE / SERVITORE

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 della pagina 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) Server Web http://..../studenti/stud.html 1 2 3

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) Server Web http://..../ cgi-bin/xxxx 1 2 3 Programma xxxx

12 HTTP + CGI Quindi: è il programma che risponde al cliente, non più il server (fa solo da tramite) tutto quello che il programma scrive sullo standard output viene 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... 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) Fondamentale il “doppio a capo”

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

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); } ristampa la stringa st che ha ricevuto Ricordare il “doppio a capo”

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 bottone per 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 Il testo scritto era PaolinoPaperino Questo campo di testo si chiamava testo Perciò, la stringa inviata è stata testo=PaolinoPaperino

27 IL MODULO (HTML) Esempio di form Inserisci il testo: e poi premi invio: Protocollo GET Azione da compie- re quando si preme il pulsante invio

28 IL MODULO (HTML) Esempio di form Inserisci il testo: e poi premi invio: 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 standard Nome=Paolino&Cognome=Paperino

32 IL MODULO PIÙ COMPLESSO (HTML) Esempio di form <FORM METHOD="GET" ACTION="http://localhost/cgi/prova1.exe" > Inserire i seguenti dati: Inserire il nome: Inserire il cognome: Un diverso programma 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=valore ci si posiziona dopo l’= parametro=valore& si cerca l’& finale (se c’è) se l’& finale non c’è, si prende fino a fine stringa finalmente si ricopia in valore il pezzo che serve

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 il sub-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) Esempio di form <FORM METHOD="POST" ACTION="http://localhost/cgi/prova2.exe" > Inserire i seguenti dati: Inserire il nome: Inserire il cognome: Un terzo programma

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) La stringa inviata ha la forma standard Nome=Paolino&Cognome=Paperino Niente più dati appesi all’URL

43 IL POST “multipart/form-data” Esempio di form <FORM METHOD="POST" ACTION="http://localhost/cgi/prova2.exe" enctype= "multipart/form-data" > Inserire i seguenti dati: Inserire il nome: Inserire il cognome: Lo stesso programma 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!


Scaricare ppt "UN SINGOLO COMPONENTE... ? Finora ci siamo concentrati su un singolo programma = un singolo componente –si leggono i dati di ingresso... –... si elabora."

Presentazioni simili


Annunci Google