HTTP Carlos Bazilio Depto de Cincia e Tecnologia
HTTP Carlos Bazilio Depto de Ciência e Tecnologia Pólo Universitário de Rio das Ostras Universidade Federal Fluminense
Arquitetura
HTML – Como funciona o envio desta mensagem? <body> <form action=“processa. Form. jsp" > Nome: <input type="text" name="firstname"> Sobrenome: <input type="text" name="lastname"> Senha: <input type="password" name="senha"> <input type="submit" value="Enviar"> </form> </body> • URL após clicar no botão: . . . /sirius/processa. Form. jsp? firstname=Carlos&lastname= Bazilio&senha=abcdefg
Tipos de requisições HTTP • GET – Parâmetros são enviados na url da solicitação – http: //localhost: 8080/sirius/processa. Form. jsp? firstnam e=Carlos&lastname=Bazilio&senha=abcdefg – Envio de parâmetros firstname e lastname e senha para um recurso no servidor (neste caso, uma página jsp – processa. Form. jsp) – Estas urls podem ser armazenadas como favoritos – Tipo padrão (default) – Não recomendado para o envio de informações sigilosas
Tipos de requisições HTTP • POST – Parâmetros são enviados de maneira invisível para o cliente (no cabeçalho da solicitação e não na url) – Com isso, a url não pode ser armazenada – Interessante para o envio de informações sigilosas • HEAD – Solicitar apenas o cabeçalho da solicitação – Interessante quando se deseja saber o tamanho ou data da atualização de um recurso
Tipos de requisições HTTP Pouco Utilizados • PUT – Colocar um documento diretamente no servidor • DELETE – Remover um documento do servidor • TRACE – Efetuar um debug da solicitação. Retorna para o cliente o conteúdo exato da solicitação • OPTIONS – Perguntar ao servidor que métodos ele suporta ou que opções estão disponíveis para algum recurso particular
Exemplos de Requisição HTTP GET / HTTP/1. 1 Host: www. siriusnet. com. br Connection: close User-agent: Mozilla/4. 0 Accept-language: fr GET http: //www. siriusnet. com. br/comochegar. html HTTP/1. 1 GET / HTTP/1. 1
Como testar uma requisição HTTP • Uma forma simples é abrindo uma conexão com o servidor web desejado: Configura o prompt local para que os comandos sejam exibidos C: . . . > telnet<Enter> telnet> set localecho<Enter> telnet> open www. siriusnet. com. br 80 <Enter> Servidor a ser no servidor; get / HTTP/1. 1<Enter> conectado Porta 80 é a porta padrão http <Enter> Cabeçalho http
Formato de Requisição HTTP <Método> <Url> <Versão> <nome-campo-cabecalho_n> : <valor_n>. . . <nome-campo-cabecalho_n> : <valor_n> Corpo da Requisição (possíveis parâmetros de uma requisição do tipo POST) Documentação: http: //www. w 3. org/Protocols/rfc 2616 sec 5. html#sec 5
Alguns campos de cabeçalho de requisição • Host: . . . Especifica o servidor no qual o objeto/recurso reside • Connection: close Solicita ao servidor que feche a conexão após envio do objeto • User-agent: . . . Tipo de browser que faz a requisição • Accept-language: . . . Indica língua preferida para o recebimento do objeto • If-Unmodified-Since: . . . Indica ao servidor para enviar apenas uma versão atualizada do objeto
<html> <frameset cols="100%, *" framespacing="0" border="0" frameborder="0"> <frame src="home. asp"> <frame src="br. htm"> <noframes> <body topmargin="0" leftmargin="0"> O seu navegador nπo suporta frames Para visualizar estß pßgina Θ necessßrio usar um navegador atualizado </body> </noframes> </frameset> </html> Exemplo de Resposta HTTP/1. 0 200 OK Date: Wed, 21 Jan 2009 13: 00: 53 GMT Server: Microsoft-IIS/6. 0 X-Powered-By: ASP. NET Content-Length: 342 Content-Type: text/html Set-Cookie: ASPSESSIONIDSSTTAADC=LNDHNMIDCHPLLEOPNAMFFGLE; path=/ Cache-Control: private X-Cache: MISS from CACHE-04 Via: 1. 1 CACHE-04: 3128 (Cacheboy) Connection: close
Formato de Resposta HTTP <Versão> <Código_Status> <Msg_Status> <nome-campo-cabecalho_n> : <valor_n>. . . <nome-campo-cabecalho_n> : <valor_n> Corpo da Resposta (mensagem HTML) • Documentação: http: //www. w 3. org/Protocols/rfc 2616 sec 6. html#sec 6. 1. 1
Códigos e Mensagens de Status • Alguns exemplos de códigos e mensagens que indicam o resultado de uma requisição: – 200 OK: Bem sucedida – 301 Moved Permanently: Objeto requisitado foi removido permanentemente; A nova url é especificada no campo de cabeçalho Location, que é recuperada automaticamente pelo software do cliente – 400 Bad Request: Requisição mal formatada – 404 Not Found: Documento inexistente no servidor – 505 HTTP Version Not Supported: Versão do protocolo HTTP não suportada pelo servidor
Alguns campos de cabeçalho de resposta • Connection: close Indica ao cliente que o servidor fechará a conexão (TCP) após enviar a mensagem • Date: . . . Data de geração da mensagem • Server: . . . Identificação do servidor (análogo a User: agent) • Last-Modified: . . . Última modificação do recurso no servidor • Content-Length: . . . Tamanho do recurso • Content-Type: text/html Tipo do recurso
Lista de Campos de Cabeçalho Gerais • Vários campos de cabeçalhos podem ser usados tanto em requisições quanto em respostas • Uma lista completa pode ser obtida no site da W 3 C – http: //www. w 3. org/Protocols/rfc 2616 sec 14. html#sec 14
Cookies • O protocolo HTTP por si só não mantém estado entre requisições • Cookies são uma forma de termos alguma informação de estado • São compostos de 4 componentes: – Um cabeçalho de cookie na mensagem de resposta – Um cabeçalho na mensagem de requisição – Um arquivo de cookie mantido no cliente e gerenciado pelo browser – Um banco de dados de apoio no site web
Cookies • Após uma primeira requisição do cliente, o servidor gera uma identificação para o usuário e insere o campo no cabeçalho da resposta: – Set-cookie: 1678453 • Nas futuras requisições do cliente, o browser irá inserir o cabeçalho abaixo para identificação do cliente – Cookie: 1678453
Conexão a servidores web em Java • O método set. Page(String url) da classe javax. swing. JEditor. Pane recebe uma url e apresenta o conteúdo html renderizado • Entretanto, imagine a situação em queremos obter o texto de algum recurso html • Como fazemos isso em Java?
Conexão a servidores web em Java • A comunicação entre servidores e clientes web é, na essência, uma comunicação via sockets • Ou seja, um cliente (navegador, por exemplo) abre uma conexão com outra máquina na sua porta 80 (porta padrão http) • Para tal, incialmente, utilizaremos classes do pacote java. net (Socket e Inet. Address) • A classe Inet. Address representa o protocolo IP, e possui métodos úteis como a “conversão” de nomes de máquinas em ip’s
Conexão a servidores web em Java - Socket String hostname = "www. siriusnet. com. br"; int port = 80; Inet. Address addr; try { // Cria conexão addr = Inet. Address. get. By. Name(hostname); Socket socket = new Socket(addr, port); // Prepara cabeçalho Buffered. Writer wr = new Buffered. Writer(new Output. Stream. Writer(socket. get. Output. Stream(), "UTF 8")); wr. write("GET / HTTP/1. 1rn"); wr. write("rn"); // Envia cabeçalho wr. flush(); // Obtém a resposta Buffered. Reader rd = new Buffered. Reader(new Input. Stream. Reader(socket. get. Input. Stream())); String line; while ((line = rd. read. Line()) != null) { System. out. println(line + "n"); } wr. close(); rd. close(); socket. close(); } catch (Unknown. Host. Exception e) {. . . } catch (IOException e) {. . . }
Conexão a servidores web em Java • Na linguagem Java há classes que tornam estas conexões mais abstratas • Por exemplo, a classe java. net. Url. Connection • Observe que a manipulação de parâmetros de requisição deve ser feita manualmente com sockets • A classe Url. Connection possui métodos específicos para a manipulação de parâmetros de requisição, por exemplo: – get. Last. Modified(): retorna a data da última modificação – set. Request. Property(key, value): define um parâmetro de requisição
Conexão a servidores web em Java - Url. Connection URL url; try { url = new URL("http: //www. siriusnet. com. br"); URLConnection conn = url. open. Connection(); Input. Stream in = conn. get. Input. Stream(); int c; while ((c = in. read()) != -1) System. out. print((char)c); } catch (Malformed. URLException e) { } catch (IOException e) { }
Web. Crawler • Com as classes vistas, temos ferramentas suficientes para criarmos um robô para varrer a web • Por exemplo, poderíamos buscar na web onde ocorrem as palavras “Sirius Sistemas Digitais” • Para tal, deveríamos buscar uma página inicial e, à partir desta, buscar recursivamente os links existentes nela
Web. Crawler – Algoritmo Geral Obtém do usuário o que se deseja buscar e a url inicial Adicione a url à lista de urls a serem pesquisadas Enquanto a lista de urls a serem pesquisadas não for vazia, faça: Obtenha a primeira url da lista Mova a url para uma lista de urls já pesquisadas Confirme que o protocolo da url é http; caso contrário, volte ao início do Enquanto Tente abrir a url (recuperar o documento do servidor web) Percorra o documento procurando por outros links Localize alguma referência (href de uma tag <a/>) Verifique se é algum documento texto (html, txt, xml, etc. . ); caso contrário, busque outro Se o link não estiver presente na lista de urls a serem pesquisadas, nem na de já pesquisadas, adicione à lista das urls a serem pesquisadas Processe o documento (por exemplo, percorra procurando por alguma informação desejada – pode ser feito em combinaçao com o item anterior) Exiba resultado da busca
“Código de Ética” para acesso a servidores web • Conexões a servidores são custosas e podem prejudicar o desempenho destes • Estas conexões indevidas acontecem com freqüência com os robôs • Existe um padrão para a exclusão de robôs: http: //www. robotstxt. org/ • Basicamente, você precisa criar um arquivo texto e deixá-lo publicamente disponível no seu servidor web configurado para exclusão dos robôs
“Código de Ética” para acesso a servidores web • A validade deste código depende do bom senso dos implementadores de robôs
Referências • http: //www. w 3 schools. com/ – Site com tutoriais on-line rápidos e com muita qualidade • http: //del. icio. us/carlosbazilio/java – Meus favoritos sobre o assunto • http: //www. w 3. org/ – Site do consórcio W 3 C • http: //java. sun. com/developer/technical. Articles/T hird. Party/Web. Crawler/ – Artigo que apresenta a implementação de um webcrawler utilizando um applet como interface
- Slides: 27