Programação
Na Web
HyperText Transfer
Protocol (HTTP)
António Gonçalves
Arquitectura
• Protocolo de transporte de documentos hypertexto
– RFC 1945 - Versão 1.0
– RFC 2616 - Versão 1.1
• O pedido é feito em ASCII e a resposta é do tipo MIME (RFC
822 e rfcs 2045, 2046, 2047, 2048, 2049)
• O servidor não mantém estado dos clientes (stateless)
• Servidor recebe pedidos normalmente em TCP-IP (porto 80)
servidor
cliente
Página Web
no écran
1
Pedido HTTP (GET …)
Resposta MIME
HTTP
http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm
Protocolo HTTP - Sintaxe
Sintaxe
Sintaxe
<COMMAND> <URL> HTTP/1.X <crlf>
{ <Header>: <Value> <crlf>}*
<crlf>
[<data>]
HTTP/1.X <result-code> [<message>] <crlf>
{ <Header>: <Value> <crlf>}+
<crlf>
[<data>]
Exº
Exº
GET /docu2.html HTTP/1.1
Accept: text/plain; text/html; image/gif, *.*
User-Agent: Mozilla4.0 (compatible;
MSIE 5.0; Windows NT; Dig Ext)
Host: www.abc.pt
From: [email protected]
* a blank line *
HTTP/1.1 200 OK
Date: Wednesday, 02-Feb-98 15:04:12 GMT
Server: Apache1.3.6 (Unix) (Red Hat Linux)
MIME-version: 1.0
Last-modified: Monday, 15-Nov-93 23:33:16 GMT
Content-type: text/html
Content-length: 2345
* a blank line *
<HTML><HEAD><TITLE> . . . </TITLE> . . .etc.
HTTP
http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm
Comandos HTTP
Comandos
sempre suportados
Comandos
nem sempre suportados
HTTP
GET
HEAD
POST
PUT
DELETE
LINK
UNLINK
pede uma página
pede apenas o cabeçalho
envia dados ao servidor
escreve uma página (inverso de GET)
remove uma página
estabelece uma ligação entre páginas
remove uma ligação entre páginas
http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm
Códigos de resposta do servidor
Tipos de códigos
de retorno
Alguns exemplos
2XX - códigos de OK
3XX - recolocação/redireccionamento
4XX - Erro no cliente
5XX - Erro no servidor
200 OK
201 Criado
204 Sem conteúdo
304 Não modificado
400 Pedido mal formado
401 Não tem autorização
501 Comando não implementado
HTTP
http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm
Cabeçalhos MIME
•
Geral:
Geral informação não relacionada com a entidade a transferir
–
–
•
Opções cliente:
cliente permite ao cliente passar informações acerca do pedido
–
–
–
–
–
•
Accept: */*
User-Agent: Lynx/2.2 libwww/2.14
From: [email protected]
If-Modified-Since: Thu, 25 Sep 1997 15:01:26 GMT
Cookie:EGSOFT_ID=193.137.220.2-640807376.29152144; expires=Fri, 31-Dec-1997 0:00:00
GMT;path=/
Resposta:
Resposta informação sobre o servidor
–
–
•
Date: Tue, 15 Nov 1994 08:12:31 GMT
MIME-Version: 1.0
Server: Apache/1.2b7
Set-Cookie: EGSOFT_ID=193.137.220.2-640807376.29152144; expires=Fri, 31-Dec-1997 0:00:00
GMT;path=/
Entidade:
Entidade informação sobre os dados entre cliente e servidor
–
–
–
–
HTTP
Last-Modified: Thu, 25 Sep 1997 15:01:26 GMT
Content-Length: 6575
Content-Type: text/html
Expires: Thu, 25 Sep 1997 15:01:26 GMT
http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm
Comando GET
• Pede um recurso (ficheiro, CGI, etc)
• Corpo sempre vazio
Resposta:
Pedido:
GET /index.html HTTP/1.1
Connection: Keep-Alive
User-Agent: Mozilla/2.02Gold (WinNT; I)
Host: www.ora.com
Accept: image/gif, image/x-xbitmap, image/jpeg
HTTP
HTTP/1.1 200 Document follows
Date: Fri, 20 Sep 1996 08:17:58 GMT
Server: NCSA/1.5.2
Last-modified: Mon, 17 Jun 1996 21:53:08 GMT
Content-type: text/html
Content-length: 2482
... corpo do documento ...
http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm
Exemplo: GET
bluejay> telnet
www.creighton.edu 80
Trying...
Connected to
parrot.creighton.edu.
Escape character is '^]'.
GET /~davereed/index.html
HTTP/1.1
Host: www.creighton.edu
HTTP/1.1 200 OK
Date: Wed, 23 Jan 2002 20:29:50 GMT
Server: Apache/1.3.19 (Unix) PHP/4.0.4pl1 mod_fastcgi/2.2.10
Last-Modified: Tue, 22 Jan 2002 06:52:39 GMT
ETag: "a9260-18a-39b49837"
Accept-Ranges: bytes
Content-Length: 394
Content-Type: text/html
<HTML>
<!--- Dave Reed
index.html
1/22/02 -->
<!--------------------------------------------------->
<HEAD>
<TITLE>Dave Reed's Home Page</TITLE>
<SCRIPT LANGUAGE="JavaScript">
if (self!=top) top.location.href=self.location.href;
</SCRIPT>
</HEAD>
<FRAMESET COLS="170,*">
<FRAME SRC="menu.html" NAME="menu">
<FRAME SRC="info.html" NAME="main">
</FRAMESET>
Resposta do Servidor
HTTP
</HTML>
http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm
Exemplo: GET Condicional
bluejay> telnet www.creighton.edu 80
Trying...
Connected to parrot.creighton.edu.
Escape character is '^]'.
GET /~davereed/ HTTP/1.1
Host: www.creighton.edu
If-Modified-Since: Wed, 5 Sep 2001 14:00:00 GMT
HTTP/1.1 304 Not Modified
Date: Wed, 23 Jan 2002 20:36:55 GMT
Server: Apache/1.3.19 (Unix) PHP/4.0.4pl1 mod_fastcgi/2.2.10
ETag: "a9260-18a-39b49837"
uma vez que o documento não foi
modificado desde a data indicada, a
página não é enviada pelo servidor (status
code 304)
HTTP
http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm
HEAD
• Pedido de informações sobre o documento e
não o documento em si.
– Data da ultima modificação, dimensão, tipo, etc.
• Corpo sempre vazio
Resposta:
Pedido:
HEAD /index.html HTTP/1.1
Host: www.deec.isel.pt
HTTP
HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Tue, 10 Nov 1998 16:52:11 GMT
Content-Type: text/html
Accept-Ranges: bytes
Last-Modified: Mon, 29 Dec 1997 01:55:11 GMT
ETag: "10e93cccfc13bd1:37f9"
Content-Length: 2604
http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm
Exemplo: HEAD
bluejay> telnet www.creighton.edu 80
Trying...
Connected to parrot.creighton.edu.
Escape character is '^]'.
HEAD /~davereed/index.html HTTP/1.1
Host: www.creighton.edu
servidor não envia a página, envia o
cabeçalho
HTTP/1.1 200 OK
Date: Wed, 23 Jan 2002 20:54:23 GMT
Server: Apache/1.3.19 (Unix) PHP/4.0.4pl1 mod_fastcgi/2.2.10
Last-Modified: Tue, 22 Jan 2002 06:52:39 GMT
ETag: "a9260-18a-39b49837"
Accept-Ranges: bytes
Content-Length: 394
Content-Type: text/html
HTTP
http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm
POST
• O cliente envia dados ao servidor no pedido (no corpo)
• O conteúdo do pedido é passado à aplicação que
processa os dados
Pedido:
POST /cgi-bin/post-query HTTP/1.1
Accept: */*
User-Agent: Lynx/2.2 libwww/2.14
From: [email protected]
Content-type: application/x-www-form-urlencoded
Content-length: 150
Host: www.isel.pt
org=Academic%20Computing%20Services
&users=10000
&browsers=lynx
&browsers=cello
&browsers=mosaic
&others=MacMosaic%2C%20WinMosaic
&contact=Michael%20Grobe%[email protected]
HTTP
Resposta:
Content-type: text/html
<H1>Query Results</H1>
You submitted the following name/value pairs:
<ul>
<li>org = Academic Computing Services
<li>users = 10000
<li>browsers = cello
<li>browsers = lynx
<li>browsers = xmosaic
<li>others = Mac Mosaic, Win Mosaic
<li>contact = Michael Grobe [email protected]
</ul>
http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm
Cookies HTTP
• O que são Cookies?
– Mecanismo que permite a aplicações HTTP servidoras
guardar e obter informações sobre o cliente.
– Manutenção de informação de estado sobre o cliente.
• Que informação contém um Cookie
– Informação sobre o estado do cliente, do ponto de vista
do servidor.
– ‘Range’ de URLs para o qual o estado é válido
HTTP
http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm
Sintaxe dos Headers HTTP
referentes aos Cookies
Set- Cookie:
ookie: {<NAME>=<VALUE>;}+ [expires=<DATE>;]
[path=<PATH>;]
>;] [secure
path=<PATH>;] [domain=<DOMAIN_NAME
[domain=<DOMAIN_NAME>;]
[secure]]
<DATE> -> Wdy, DD-Mon-YYYY HH:MM:SS GMT
Cookie:
Cookie: {<NAME>=<VALUE>;}+
HTTP
http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm
Algumas notas sobre Cookies
• Uma resposta HTTP pode conter múltiplos Set-Cookie
• Instancias com a mesma ‘path’ e nome, são rescritas tendo
precedência a ultima delas.
– Instancias da mesma ‘path’ mas com nomes diferentes, são adicionados ao
conjunto.
• Definindo um Cookie com uma ‘path’ mais genérica, não remove
Cookies com ‘paths’ mais específicas.
– São enviados todos os mapeamentos para um Cookie, mesmo com ‘paths’
diferentes
– Quando enviados para o servidor, os cookies com ‘path’ mais específica deverão
ser enviados primeiro.
• O campo expires indica ao cliente quando o Cookie deve ser
removido.
– No entanto o cliente não é obrigado a removê-lo.
– O cliente pode remover o Cookie antes deste expirar se o número de cookies
exceder os limites internos do cliente.
HTTP
http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm
Algumas notas sobre Cookies
•
Limites mínimos para o número de Cookies que um cliente pode
guardar de cada vez.
– 300 Cookies no total
– 4 Kb por Cookie
– 20 Cookies por domínio
•
Para uma aplicação servidora apagar um Cookie no cliente, deverá
enviar na resposta um Cookie com o mesmo nome e uma data de
expiração passada.
•
Os proxys HTTP não deverão fazer cache dos headers ‘Set-Cookie’
•
Se um proxy receber um header ‘Set-Cookie’ deverá propaga-lo para o
cliente independentemente do código de resposta ser 304 (Não
modificado) ou 200 (Ok)
•
Da mesma forma se um pedido HTTP tiver headers Cookie, estes
deverão ser propagados por um proxy, independentemente de ser im
pedido condicional (If-modofied-since) ou não.
HTTP
http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm
Exemplos de transacções HTTP
com Cookies
•
(1) Cliente envia um pedido e recebe a resposta:
– Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/; expires=Wednesday, 09-May1999 23:00:00 GMT
•
(2) Cliente envia um pedido na path ‘/’:
•
(3) Servidor envia resposta
•
(4) Cliente envia um pedido na path ‘/’:
– Cookie: CUSTOMER=WILE_E_COYOTE
– Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/
– Cookie: CUSTOMER=WILE_E_COYOTE;
PART_NUMBER=ROCKET_LAUNCHER_0001
•
(5) Servidor envia resposta
•
(6) Cliente envia um pedido na path ‘/’:
– Set-Cookie: SHIPPING=EDEX; path=/foo
– Cookie: CUSTOMER=WILE_E_COYOTE;
PART_NUMBER=ROCKET_LAUNCHER_0001
•
(7) Cliente envia um pedido na path ‘/foo’:
– Cookie: SHIPPING=EDEX; CUSTOMER=WILE_E_COYOTE;
PART_NUMBER=ROCKET_LAUNCHER_0001
HTTP
http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm
Download

Programação