GET /conceitos HTTP/1.1

4,898 views

Published on

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.

GET /conceitos HTTP/1.1

  1. 1. 1 GET/conceitosHTTP/1.1 Alexandre Gomes Gaigalas PHP Conference 2010 – 26 de Novembro
  2. 2. 2 AlexandreGomesGaigalas ● PHP 5 ● OOP ● REST ● Linked Data
  3. 3. 3 KingoLabs ● 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. 4. 4 Programaçãodehoje ● 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. 5. 5 HyperTextTransferProtocol ● 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. 6. 6 Protocolo é um conjunto de regras de comunicação
  7. 7. 7 HTTP:Cliente-Servidorclássico Cliente Servidor Requisição Resposta
  8. 8. 8 ElestambémsãoHTTP... ● AJAX (XmlHTTPRequest) ● Adobe Flex ● REST ● SOAP
  9. 9. 9 GETePOST São dois métodos HTTP
  10. 10. 10 <formmethod=”GET”>naPrá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. 11. 11 <formmethod=”POST”>naPrá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. 12. 12 GETnaTeoria ● 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. 13. 13 POSTnaTeoria ● 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. 14. 14 Outrosmétodos ● DELETE para excluir dados ● PUT para atualizar/inserir dados em um local específico ● $_SERVER['REQUEST_METHOD']
  15. 15. 15 UmaRequisiçãoHTTP GET /index.html HTTP/1.1 Host: example.com rn rn
  16. 16. 16 UmaRequisiçãoHTTP GET /index.html HTTP/1.1 Host: example.com rn rn Método Recurso Cabeçalho Protocolo Linha em Branco
  17. 17. 17 UmaRequisiçãoHTTP ● Método: $_SERVER['REQUEST_METHOD'] ● Recurso: $_SERVER['REQUEST_URI'] ● Protocolo: $_SERVER['SERVER_PROTOCOL'] ● Cabeçalhos: $_SERVER['HTTP_*']
  18. 18. 18 AcessandoCabeçalhosHTTP ● Host: $_SERVER['HTTP_HOST'] ● User-Agent: $_SERVER['HTTP_USER_AGENT'] ● X-FooBar: $_SERVER['HTTP_X_FOOBAR']
  19. 19. 19 UmaRespostaHTTP HTTP/1.1 200 Ok Date: Mon, 22 November... Content-Length: 3 Content-type: text/html rn Oi!
  20. 20. 20 UmaRespostaHTTP HTTP/1.1 200 Ok Date: Mon, 22 November... Content-Length: 3 Content-type: text/html rn Oi! Protocolo Status Nova Linha Cabeçalhos Corpo
  21. 21. 21 Content-Length ● “Oi!” = 3 ● “Hello World” = 11 ● “” = 0 ● O PHP calcula automaticamente!
  22. 22. 22 Content-Type ● text/html ● text/xml ● application/json ● text/plain ● image/jpeg
  23. 23. 23 CódigosdeStatus ● 1xx – Informativo ● 2xx – Sucesso! ● 3xx – Redirecionamento ● 4xx – Erro do cliente ● 5xx – Erro do servidor
  24. 24. 24 CódigosdeStatusfamosos ● 404 Not Found ● 503 Service Unavailable ● 403 Forbidden ● 401 Unauthorized ● 301 Redirect
  25. 25. 25 CódigosdeStatusnoPHP(envio) header('HTTP/1.1 201 Created');
  26. 26. 26 CódigosdeStatusnoAJAX(client) req = new XmlHttpRequest; req.onreadystatechange(function(){ console.log(req.status); }); req.open(“GET”, “/index.html”, true); req.send(“”);
  27. 27. 27 CódigosdeStatusnojQuery(client) $.ajax({ url: index.html, complete: function(req) { console.log(req.status); } });
  28. 28. 28 CódigosdeSucesso ● 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. 29. 29 CódigosdeRedirecionamento ● 300MultipleChoices–Acheiváriascoisas,escolhauma. ● 301Redirect–Issoquevocêprocuramudouprasempredelugar. ● 302Found–Issoquevocêprocuranomomentoestáaqui. ● 303SeeOther–Suarequisiçãofoiaceita,olhaelaaqui. ● 304NotModified–Nadanovonoservidor,nemsepreocupe. ● 307TemporaryRedirect–Oquevocêprocuraestátemporariamenteaqui.
  30. 30. 30 CódigosdeErrodoCliente ● 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. 31. 31 CódigosdeErrodoServidor ● 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. 32. 32 RecursoseMétodosRESTful ● /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. 33. 33 Recursos:Substantivos ● /usuario ● /usuario/ultimo ● /usuario/alganet ● /categoria/php
  34. 34. 34 QueryString:Atributos ● /usuario?estado=SP ● /categoria?nome=php ● /busca?termo=programador
  35. 35. 35 NegociaçãodeConteúdo ● $_SERVER['HTTP_ACCEPT'] – text/html ● $_SERVER['HTTP_ACCEPT_LANGUAGE'] – pt-BR ● $_SERVER['HTTP_ACCEPT_CHARSET'] – utf-8
  36. 36. 36 NegociaçãodeConteúdo ● header('Content-Type: text/html; charset=utf-8'); ● header('Content-Language: pt-BR');
  37. 37. 37 Cache header('Expires: Thu, 23 November 2010 00:00:01 GMT');
  38. 38. 38 Cache
  39. 39. 39 Exemplos
  40. 40. 40 POST-redirect-GET ● POST /usuario “username=alganet” ● 303 See Other /usuario/alganet ● GET /usuario/alganet ● 201 Created
  41. 41. 41 DELETE ● DELETE /usuario/alganet ● 205 Reset Content
  42. 42. 42 POSTcomdadosinválidos ● POST /usuario “username=$%$%” ● 400 Bad Request
  43. 43. 43 GETparaURLsamigáveis ● GET /usuario?username=alganet ● 301 See Other /usuario/alganet ● GET /usuario/alganet ● 200 Ok
  44. 44. 44 NegociaçãodeConteúdo ● GET /usuario/alganet (Accept: text/xml) ● 303 See Other /usuario/alganet.xml
  45. 45. 45 Cache ● GET /usuario/alganet ● 200 Ok (ETag: 2fe450ed30acb) ● GET /usuario/alganet (If-None-Match: 2fe450ed30acb) ● 304 Not Modified
  46. 46. 46 Obrigado!
  47. 47. 47 Eu,aquieali. ● http://twitter.com/alganet ● http://github.com/alganet ● http://about.me/alganet ● http://gaigalas.net ● alexandre@gaigalas.net

×