Upload
alexandre-gaigalas
View
4.062
Download
0
Embed Size (px)
DESCRIPTION
O protocolo HTTP está há mais de 10 anos nos bastidores de quase todas as aplicações web, incluindo a explosão de uso do AJAX e a nova onda de APIs em REST. Está diretamente relacionado com a performance, ecalabilidade e SEO.Saber como ele funciona e como o PHP interage com ele é conhecimento obrigatório para qualquer programador web.
Citation preview
1
GET /conceitos HTTP/1.1Alexandre Gomes Gaigalas
PHP Conference 2010 – 26 de Novembro
2
Alexandre Gomes Gaigalas
● PHP 5
● OOP
● REST
● Linked Data
3
Kingo Labs
● Coleta e Análise de Dados
● Twitter, Facebook, Foursquare, etc
● Sorteie.me, trmanager, Kingo Meter, kingo.to,
rial.to, etc
● Ubuntu, PHP 5.3, MySQL, MongoDB
4
Programação de hoje● Introdução sobre o HTTP
● Teoria por trás do GET e POST
● Exemplos de Requisição
● Códigos de Status
● REST: Recursos e Métodos
● Negociação de Conteúdo
● Cache
● Exemplos
5
Hyper Text Transfer Protocol
● Também é um padrão do W3C.
● Criado há mais de 10 anos.
● Não tem frescura com implementações. Todos os
navegadores respeitam.
● Define toda a arquitetura da web.
6
Protocoloé um conjunto de regras de comunicação
7
HTTP: Cliente-Servidor clássico
Cliente
Servidor
Requisição Resposta
8
Eles também são HTTP...
● AJAX (XmlHTTPRequest)
● Adobe Flex
● REST
● SOAP
9
GET e POSTSão dois métodos HTTP
10
<form method=”GET”> na Prática
● Os parâmetros são enviados pela URL
● No PHP: $_GET
● Não é possível upload de arquivos
● Não pede confirmação de re-envio quando
atualiza a página
11
<form method=”POST”> na Prática
● Os parâmetros não aparecem na URL
● No PHP: $_POST
● É possível upload de arquivos
● Pede confirmação de re-envio quando atualiza a
página
12
GET na Teoria
● Método HTTP para obter dados
● Os parâmetros são parâmetros de pesquisa
● Formulários de busca, filtros de relatórios, etc.
13
POST na Teoria
● Método HTTP para enviar dados
● Os parâmetros são dados a serem enviados
● Formulários de inserção, atualização,
processamento remoto, etc
14
Outros métodos
● DELETE para excluir dados
● PUT para atualizar/inserir dados em um local
específico
● $_SERVER['REQUEST_METHOD']
15
Uma Requisição HTTP
GET /index.html HTTP/1.1Host: example.com\r\n\r\n
16
Uma Requisição HTTP
GET /index.html HTTP/1.1Host: example.com\r\n\r\n
Método Recurso
Cabeçalho
Protocolo
Linha emBranco
17
Uma Requisição HTTP
● Método: $_SERVER['REQUEST_METHOD']
● Recurso: $_SERVER['REQUEST_URI']
● Protocolo: $_SERVER['SERVER_PROTOCOL']
● Cabeçalhos: $_SERVER['HTTP_*']
18
Acessando Cabeçalhos HTTP
● Host: $_SERVER['HTTP_HOST']
● User-Agent: $_SERVER['HTTP_USER_AGENT']
● X-FooBar: $_SERVER['HTTP_X_FOOBAR']
19
Uma Resposta HTTP
HTTP/1.1 200 OkDate: Mon, 22 November...Content-Length: 3Content-type: text/html\r\nOi!
20
Uma Resposta HTTP
HTTP/1.1 200 OkDate: Mon, 22 November...Content-Length: 3Content-type: text/html\r\nOi!
Protocolo Status
Nova Linha
Cabeçalhos
Corpo
21
Content-Length
● “Oi!” = 3
● “Hello World” = 11
● “” = 0
● O PHP calcula automaticamente!
22
Content-Type
● text/html
● text/xml
● application/json
● text/plain
● image/jpeg
23
Códigos de Status
● 1xx – Informativo
● 2xx – Sucesso!
● 3xx – Redirecionamento
● 4xx – Erro do cliente
● 5xx – Erro do servidor
24
Códigos de Status famosos
● 404 Not Found
● 503 Service Unavailable
● 403 Forbidden
● 401 Unauthorized
● 301 Redirect
25
Códigos de Status no PHP (envio)
header('HTTP/1.1 201 Created');
26
Códigos de Status no AJAX (client)
req = new XmlHttpRequest;req.onreadystatechange(function(){ console.log(req.status);});req.open(“GET”, “/index.html”, true);req.send(“”);
27
Códigos de Status no jQuery (client)
$.ajax({ url: index.html, complete: function(req) { console.log(req.status); }});
28
Códigos de Sucesso● 201 Created – Sua requisição gerou algo no
servidor, aqui está ele.
● 202 Accepted – Sua requisição foi aceita e o
servidor está gerando algo.
● 204 No Content – Deu tudo certo, nada pra exibir
29
Códigos de Redirecionamento
● 300 Multiple Choices – Achei várias coisas, escolha uma.
● 301 Redirect – Isso que você procura mudou pra sempre de lugar.
● 302 Found – Isso que você procura no momento está aqui.
● 303 See Other – Sua requisição foi aceita, olha ela aqui.
● 304 Not Modified – Nada novo no servidor, nem se preocupe.
● 307 Temporary Redirect – O que você procura está temporariamente aqui.
30
Códigos de Erro do Cliente
● 400 Bad Request – Não consigo entender o que você
pediu.
● 401 Unauthorized – Você não tem permissão pra isso.
● 403 Forbidden – Ninguém tem permissão pra isso.
● 404 – Não achei.
● 405 – Método não permitido.
31
Códigos de Erro do Servidor
● 500 Internal Server Error – Alguma merda aconteceu.
● 501 Not Implemented – Esse servidor não entende esse
método.
● 502 Bad Gateway – Eu estava contando com outro
servidor, mas ele pisou na bola.
● 503 Service Unavailable – Tô sobrecarregado, espera um
pouco.
32
Recursos e Métodos RESTful
● /usuario/criar
● /usuario/atualizar
● /usuario/excluir
● /usuario/buscar
● /usuario/exibir
● POST /usuario
● PUT /usuario/alganet
● DELETE /usuario/alganet
● GET /usuario?q=
● GET /usuario/alganet
33
Recursos: Substantivos
● /usuario
● /usuario/ultimo
● /usuario/alganet
● /categoria/php
34
Query String: Atributos
● /usuario?estado=SP
● /categoria?nome=php
● /busca?termo=programador
35
Negociação de Conteúdo
● $_SERVER['HTTP_ACCEPT'] – text/html
● $_SERVER['HTTP_ACCEPT_LANGUAGE'] – pt-BR
● $_SERVER['HTTP_ACCEPT_CHARSET'] – utf-8
36
Negociação de Conteúdo
● header('Content-Type: text/html; charset=utf-8');
● header('Content-Language: pt-BR');
37
Cache
header('Expires: Thu, 23 November 2010 00:00:01 GMT');
38
Cache
39
Exemplos
40
POST-redirect-GET
● POST /usuario “username=alganet”
● 303 See Other /usuario/alganet
● GET /usuario/alganet
● 201 Created
41
DELETE
● DELETE /usuario/alganet
● 205 Reset Content
42
POST com dados inválidos
● POST /usuario “username=$%$%”
● 400 Bad Request
43
GET para URLs amigáveis
● GET /usuario?username=alganet
● 301 See Other /usuario/alganet
● GET /usuario/alganet
● 200 Ok
44
Negociação de Conteúdo
● GET /usuario/alganet (Accept: text/xml)
● 303 See Other /usuario/alganet.xml
45
Cache
● GET /usuario/alganet
● 200 Ok (ETag: 2fe450ed30acb)
● GET /usuario/alganet (If-None-Match: 2fe450ed30acb)
● 304 Not Modified
46
Obrigado!
47
Eu, aqui e ali.
● http://twitter.com/alganet
● http://github.com/alganet
● http://about.me/alganet
● http://gaigalas.net