Java, HTTP, CGI e Linguagens de Scripting Java e Engenharia de Software Orientada a Objetos por Jorge H. C. Fernandes (jorgehcfernandes@uol.com.br) 2003
Objetivos desta Aula Descrever o protocolo HTTP, utilizado para prover a comunicação entre clientes e servidores na Web Mostrar como o protocolo HTTP é usado em browsers, servidores e em programas Java Descrever a tecnologia de CGI scripts Mostrar como integrar formulários HTML e scripts CGI
Referências RFCs 2068/2616 - HTTP/1.1, Jan/97, Jul/99 http://www.w3.org/protocols/rfc2068/rfc2068 http://sunsite.hr/cgi-bin/rfc/rfc2616.txt CGI Programming on the WWW Perl (http://perl.oreilly.com) Programming Perl, 2nd Edition Advanced Perl Programming HTML http://www.w3.org http://www.ozemail.com.au/~dkgsoft/html3/index.html http://www.hut.fi/~jkorpela/html3.2/
Conteúdo Elementos que compõem a WWW Recuperando um recurso através do GET CGI e Formulários HTML: Visão Geral O Protocolo HTTP CGI, Formulários e HTTP Diferenças e Aplicação dos Métodos GET e POST Linguagens de Scripting: Perl
World Wide Web: Elementos que Compõem a WWW Universal Resource Locator (URL) Hypertext Markup Language (HTML) Web Server Web Browser Hypertext Transfer Protocol (HTTP) CGI e Formulários HTML
WWW: O Cliente/Servidor Universal Web Server Web Browser WWW (HTTP) URL Base de documentos hipermídia: HTML, gif, etc Bem Vindo! Bem Vindo!
Protocolo HTTP: Hypertext Transfer Protocol
HTTP Permite transferência de recursos hipermídia entre clientes e servidores Esquema síncrono de pedido e resposta Cada pedido contém um identificador de recursos e um método a ser aplicado ao recurso
HTTP: Histórico HTTP: A Stateless Search, Retrieve and Manipulation Protocol Internet Draft, Nov de 1993 HTTP/1.1 RFC 2068, Janeiro de 1997
HTTP/1.0 Nível de Aplicação Stateless Conexão (TCP/IP port 80) Pedido (Cliente -> Servidor) Resposta (Servidor -> Cliente) Fechamento da Conexão Negociação de Conteúdo
HTTP/1.0 Web Server Web Browser WWW (HTTP) Base de documentos hipermídia: HTML, gif, etc Java Programando para a Internet URL Java: Programando para a Internet
HTTP/1.1 Conexões Persistentes Proxy Cache Autenticação Mensagens Tipos: Request e Response Line + Header* + Body
Detalhes do Protocolo HTTP 1.1 Detalhes do Pedido Detalhes da Resposta
Detalhes do Pedido HTTP
Um Típico Pedido HTTP (com GET) GET /~jhcf/cgi/welcome.html HTTP/1.0 Connection: Keep-Alive User-Agent: Mozilla/4.5 [en] (WinNT; I) Host: www.di.ufpe.br:80 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */* Accept-Encoding: gzip Accept-Language: en Accept-Charset: iso-8859-1,*,utf-8
HTTP/1.1 Request Request ::= Request-Line+Header*+Body Request-Line ::= Method+ +URI+ +HTTP-Version Method: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, extensões Header ::= GeneralHeader + RequestHeader GeneralHeader (qualifica a conexão) RequestHeader (qualifica o pedido)
HTTP/1.1 Methods OPTIONS - que opções do servidor oferece? GET - solicita recurso HEAD - cabeçalho do recurso POST - envia informações para o recurso PUT - solicita adicionar recurso ao servidor DELETE - solicita remoção do recurso TRACE - diagnóstico extension - acordado entre o cliente e o servidor
HTTP/1.1 General Header Fields Cache-control: #cache-directive Connection Date Pragma Transfer-Encoding Upgrade (mudar de protocolo) Via (gateways e proxyes)
HTTP/1.1 Request Header Fields Accept Accept-Charset Accept-Encoding Accept-Language Authorization From Host Max-Forwards If-Modified-Since If-Match If-None-Match If-Range If-Unmodified-Since Proxy-Authorization Range Referer User-Agent
Detalhes da Resposta HTTP
Uma Típica Resposta HTTP HTTP/1.1 200 OK Date: Wed, 28 Jul 1999 02:29:08 GMT Server: Apache/1.2.5 Last-Modified: Wed, 28 Jul 1999 01:32:21 GMT ETag: "1bfc-62-379e5da5" Content-Length: 98 Accept-Ranges: bytes Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Content-Type: text/html <HTML> <HEAD> <TITLE> Saudação </TITLE> </HEAD> <BODY> <H1>Bem vindo à Web!</H1> </BODY> </HTML>
HTTP/1.1 Response Response ::= Status-Line+Header*+Entity Body Status-Line ::= HTTP-Version+ +Reason-Phrase Reason: 1xx, 2xx, 3xx, 4xx, 5xx Header ::= Response-Header* + Entity-Header* Response-Header (Qualifica resposta) Entity-Header (Qualifica corpo da resposta) Entity Body conteúdo de arquivos HTML, GIF, JPG, classe Java, documento Word, documento texto, etc
HTTP/1.1 Status Line Informational 1xx Successful 2xx Redirection 3xx Client Error 4xx Server Error 5xx
HTTP/1.1 Response Header Fields Age Location Proxy-Authenticate Public Retry-After Server Vary Warning WWW-Authenticate
HTTP/1.1 Entity Header Fields Allow Content-Base Content-Encoding Content Length Content-Location Content-MD5 Content-Range Content-Type Etag Expires Last-Modified <extension-header>
Recuperando recursos na Web através do Método GET Execute um browser HTML Peça para carregar uma URL e veja o recurso obtido Por exemplo: http://www.di.ufpe.br/~jhcf/cgi/welcome.html Veja no browser o fonte dos documentos HTML que você carregou Pegue os mesmos recursos na Web usando a classe GetURL Observe no LOG DE EXECUÇÃO resposta HTTP ao pedido Instale o mini-servidor HTTP na sua máquina e faça testes com ele Acesse os recursos de seu servidor através do browser (Veja no EXECUTION LOG do mini-servidor o pedido HTTP que seu browser gerou) Acesse os recursos de seu servidor através da classe GetURL (Veja no EXECUTION LOG do mini-servidor o pedido HTTP que seu browser gerou. Compare com a resposta HTTP no LOG da classe GetURL) Instale applets na área de seu servidor e teste-os
CGI e Formulários HTML
CGI e Formulários HTML: Detalhes Definições Métodos Principais GET POST Usando POST em Formulários HTML Scripts em PERL
CGI, Formulário e Resposta HTML Web Server WWW (HTTP) Web Browser Consulta Fotos Nome: CGI script Consulta Formulário Fotos Nome: Maria Ano Mod Consultar Consultar
CGI (Common Gateway Interface): Definições CGI Parte do Web Server que pode se comunicar com outros programas executando no servidor. Invocação de um programa com passagem de informações específicas enviadas pelo usuário Host com o qual o usuário se conectou Entrada de dados através de HTML forms, etc Saída de dados de um script CGI é (normalmente) gerada no formato HTML, o qual é enviado como resposta ao usuário (cliente Web) CGI está sendo rapidamente substituida por servlets
CGI - Métodos Principais Método GET Utilizado quando a quantidade de dados a passar para o servidor é pequena Dados passados através da URL Método POST Utilizado quando a quantidade de dados a passar para o servidor é maior Dados passados no corpo do pedido HTTP Formulários
CGI: Método GET
CGI: Método GET O Pedido HTTP não tem CORPO Possíveis informações para orientar o atendimento ao pedido estão embutidas na URL Exemplo 1 Não há informações adicionais na URL Exemplo 2 Informações adicionais através da URL
Método GET - Exemplo 1: O Pedido HTTP GET /cgi-jhcf/helloworld.pl HTTP/1.0 Connection: Keep-Alive User-Agent: Mozilla/4.5 [en] (WinNT; I) Host: padct01:8000 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */* Accept-Encoding: gzip Accept-Language: en Accept-Charset: iso-8859-1,*,utf-8
Método GET - Exemplo 1: A Resposta HTTP HTTP/1.1 200 OK Date: Wed, 28 Jul 1999 01:47:34 GMT Server: Apache/1.2.5 Connection: close Content-Type: text/html <HTML> <HEAD><TITLE>Hello World</TITLE> </HEAD> <BODY> <H1>Hello World</H1> </BODY> </HTML>
Método GET - Exemplo 1: A Saída Gerada pelo Script #!/usr/local/bin/perl # # hello world escrito por jhcf # print "Content-Type: text/html\n"; print "\n"; print "<HTML>\n"; print "<HEAD><TITLE>Hello World</TITLE>\n"; print "</HEAD>\n"; print "<BODY>\n"; print "<H1>Hello World</H1>\n"; print "</BODY>\n"; print "</HTML>\n"; exit;
Exercícios: Usando CGI com o Método GET Modifique o script HelloWorld.pl para que ele produza uma saudação personalizada Teste o funcionamento seu script CGI
Método GET - Exemplo 2: OPedidoHTTP GET /cgi-jhcf/consultafotosget.pl?maria HTTP/1.0 Connection: Keep-Alive User-Agent: Mozilla/4.5 [en] (WinNT; I) Host: www.di.ufpe.br Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */* Accept-Encoding: gzip Accept-Language: en Accept-Charset: iso-8859-1,*,utf-8
Método GET - Exemplo 2: A Resposta HTTP HTTP/1.1 200 OK Date: Wed, 28 Jul 1999 02:46:22 GMT Server: Apache/1.2.5 Connection: close Content-Type: text/html <html> <head><title>foto de maria</title></head> <body> <h1>foto de maria</h1> <img src="/~jhcf/cgi/fotos/maria.gif"><br> </body> </html>
Método GET - Exemplo 2: A Resposta Formatada
Método GET - Exemplo 2: O Script PERL que gerou a Resposta #!/usr/local/bin/perl # consulta fotos escrito por jhcf. Produz a saida do script CGI/GET $nome=$argv[0]; print "Content-Type: text/html\n"; print "\n"; print "<html>\n"; print "<head><title>foto de ",$nome,"</title></head>\n"; print "<body>\n"; print "<h1>foto de ",$nome,"</h1>\n"; print "<img src=\"\/~jhcf\/cgi\/fotos\/",$nome,".gif\"><br>\n"; print "</body>\n"; print "</html>\n"; exit;
CGI: Método POST
CGI, Formulário e Resposta HTML Web Server WWW (HTTP) Web Browser Consulta Fotos Nome: CGI script Consulta Formulário Fotos Nome: Maria Ano Mod Consultar Consultar
Formulário e Respostas HTML com POST
O Pedido HTTP Enviado pelo Browser POST /cgi-jhcf/consultafotos.pl HTTP/1.0 Referer: http://www.di.ufpe.br/~jhcf/cgi/consultafotos.html Connection: Keep-Alive User-Agent: Mozilla/4.5 [en] (WinNT; I) Pragma: no-cache Host: www.di.ufpe.br:80 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */* Accept-Encoding: gzip Accept-Language: en Accept-Charset: iso-8859-1,*,utf-8 Content-type: application/x-www-form-urlencoded Content-length: 10 nome=maria
A Resposta HTTP Enviada pelo Servidor HTTP/1.1 200 OK Date: Tue, 27 Jul 1999 18:21:55 GMT Server: Apache/1.2.5 Connection: close Content-Type: text/html <html> <head><title>foto de maria</title></head> <body> <h1>foto de maria</h1> <img src="/~jhcf/cgi/fotos/maria.gif"><br> </body> </html>
Parte do Script CGI (em PERL) que Gerou a Resposta
Opções no Formulário HTML
Opções de entrada de dados em Formulários HTML
Opções de entrada de dados em Formulários HTML
TAGS em Formulários HTML <FORM ACTION="/cgi-jhcf/eco.cgi" METHOD="POST"> Texto: <INPUT TYPE="text" NAME="texto" VALUE="uma linha de texto" SIZE="20"><br> Senha: <INPUT TYPE="password" NAME="senha" VALUE="senha" SIZE="8"><br> Escondido: <INPUT TYPE="hidden" NAME="escondido" VALUE="valor escondido" SIZE="10"><BR> Checkbox: <INPUT TYPE="checkbox" NAME="checkbox" VALUE="marcado"><BR>
TAGS em Formulários HTML Radio #1: <INPUT TYPE="radio" NAME="radio" VALUE="1"> #2: <INPUT TYPE="radio" NAME="radio" VALUE="2"> #3: <INPUT TYPE="radio" NAME="radio" VALUE="3"><BR> SelecaoSimples: <SELECT NAME="selecaoSimples" SIZE="1"> <OPTION SELECTED>Um <OPTION>Dois <OPTION>Tres <OPTION>Quatro </SELECT><BR>
TAGS em Formulários HTML Selecao Multipla: <SELECT NAME="selecaoMultipla" SIZE=4 MULTIPLE> <OPTION SELECTED>Um Selecionado <OPTION>Dois Selecionado <OPTION>Tres Selecionado <OPTION>Quatro Selecionado </SELECT><BR> Area Texto: <TEXTAREA ROWS=4 COLS=20 NAME="areaTexto"> Coloque qualquer texto aqui </TEXTAREA><BR>
TAGS em Formulários HTML Submeter: <INPUT TYPE="submit" VALUE="submeter"><BR> Submeter: <INPUT TYPE="image" SRC="fotos/maria.gif" NAME="imagem" VALUE="imagem"><BR> Limpar: <INPUT TYPE="reset" VALUE="Limpar"><BR> </FORM>
O Pedido HTTP
Pedido HTTP gerado pelo Formulário HTML POST /cgi-jhcf/form.pl HTTP/1.0 Referer: http://padct01:80/form.html Connection: Keep-Alive User-Agent: Mozilla/4.5 [en] (WinNT; I) Host: padct01:80 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */* Accept-Encoding: gzip Accept-Language: en Accept-Charset: iso-8859-1,*,utf-8 Content-type: application/x-www-form-urlencoded Content-length: 138 texto=text&senha=password&escondido=hidden&selecao=one&selecaomult= One&areatexto=Informa%E7%E3o+%22default%22+%0D%0A&image.x= 27&image.y=27
A Resposta HTML
A Resposta (HTML Fonte e Formatado)
O Script CGI: em Perl
Linguagens de Script O que são? Linguagens p/ Programação Rápida Requisitos Manipulação de texto Interface com Bibliotecas Acesso às variáveis de ambiente Exemplos PERL, C/C++, Tcl, Java, JavaScript, VisualBasic, Python
Perl: Program Extraction and Report Language Linguagen interpretada otimizada para varredura em arquivos de texto arbitrários, extraindo informações destes arquivos de texto e imprimindo relatórios
Perl: Blocos de Código do Script eco.cgi Declara que o arquivo deve ser interpretado como um script PERL Renomeia a entrada Declara uma subrotina que monta um dicionário com os valores do formulário Invoca a subrotina Produz o HTML Encerra o script
Declara o arquivo como um script PERL, e renomeia a entrada #!/usr/local/bin/perl # # bounce (eco) escrito por jhcf # $entrada=<stdin>;
Declara rotina que monta um dicionário com os valores do formulário sub inputparser { local($buffer) = @_; chomp($buffer); @pares = split(/&/,$buffer); foreach $pares (@pares) { ($nome,$valor) = split(/=/,$pares); $valor =~ tr/+/ /; $valor =~ s/%([\da-fa-f]{2})/pack("c",hex($1))/eg; if (! defined $FORM{$nome}) { $FORM{$nome} = $valor; } else { $FORM{$nome} = $FORM{$nome}.",". $valor; } } }
Invoca a rotina inputparser, produz a saída do script e encerra o programa &inputparser($entrada); print "Content-Type: text/html\n"; print "\n"; print "<HTML>\n"; print "<HEAD><TITLE>Eco</TITLE>\n"; print "</HEAD>\n"; print "<BODY>\n"; print "<H1>Eco: Dados recebidos no Formulário </h1>\n"; foreach $key (keys %FORM) { print "<li>", $key, "=", @FORM{$key},"\n"; } print "</BODY>\n"; print "</HTML>\n"; exit;
Observações Sobre Perl A linguagem permite desenvolvimento rápido Tem muitos recursos de manipulação de caracteres e arrays associativos O Código não é orientado a objetos Sistemas tendem a ficar muito complexos com o passar do tempo
Observações sobre CGI A criação de um processo para cada pedido consume muito recurso de CPU Otimizações são proprietárias de cada sistema CGI está sendo rapidamente substituida por Servlets, embora o modelo básico de programação seja o mesmo
Exercício Monte um formulário HTML para creditar e debitar de uma conta bancária através de um script CGI, usando o método POST A computação no lado do servidor (CGI) será criada posteriormente, na forma de um Servlet
FIM