PHP RESTful Web Services - PHPConf'09

8,363 views
8,250 views

Published on

Palestra apresentada por mim, Felipe Ribeiro, na PHPConference Brasil 2009

Published in: Technology

PHP RESTful Web Services - PHPConf'09

  1. 1. http://flickr.com/photos/estherase/128983854/ PHP RESTful Web Services Felipe Ribeiro felipernb@php.net http://feliperibeiro.com @felipernb
  2. 2. Felipe Ribeiro Graduando (concluinte) em Ciência da Computação na UFCG Zend Certified Engineer - PHP5 Trabalha como desenvolvedor Web e consultor com foco em performance e escalabilidade de Websites Experiência em grids computacionais e sistemas distribuídos Membro fundador do grupo PHP-PB Contribuidor do PHP e Mozilla Camino
  3. 3. Cloud computing SaaS - Software as a Service
  4. 4. Web Services
  5. 5. Web Services • Web service é uma solução utilizada na integração de sistemas e na comunicação entre aplicações diferentes. • Padrões Abertos • Independência • Sistema Operacional • Linguagem de Programação
  6. 6. SOAP é o padrão no mercado... http://www.flickr.com/photos/katcameron/140299496
  7. 7. Mas SOAP é complicado! http://www.flickr.com/photos/jerry7171/192391979/
  8. 8. O SOAP ideal • Primeiro, você usa UDDI para descobrir aonde estão os serviços que você está interessado em consumir. • Depois você vai consumir os arquivos WSDL que descrevem os serviços com uma ferramenta geradora de clientes de web services. • Aí você vai poder finalmente enviar as requisições dos seus serviços via HTTP, SMTP, FTP… http://www.flickr.com/photos/jerry7171/192391979/
  9. 9. Mas o mundo é cruel... • Registros UDDI são tão lendários que está sendo produzido o filme: “Indiana Jones e a ilha do UDDI perdido” • O único padrão das mensagens é como o formato delas é definido (WSDL), quase nenhuma industria de peso tem formatos de mensagens padronizados; • Ninguém usa web services em SOAP sem HTTP; • Nem sempre é fácil fazer tecnologia X conversar com tecnologia Y via SOAP. • O modo de invocação dos web services mata qualquer possibilidade de se desenvolver clientes Ajax para eles; http://www.flickr.com/photos/jerry7171/192391979/
  10. 10. REST - Representational State Transfer http://www.flickr.com/photos/practicalowl/392894653/
  11. 11. • REST não é um envelope XML semelhante ao SOAP • REST não é um framework/toolkit • REST não é padronizado pela W3C http://www.flickr.com/photos/practicalowl/392894653/
  12. 12. • Conjunto de princípios para uma arquitetura baseada em como a Web funciona • ROA - Resource Oriented Architecture (Arquitetura orientada a recursos) • Utiliza padrões já existentes (HTTP, XML,...) • Tese de doutorado de Roy Fielding (2000) • Interface uniforme para acesso aos recursos http://www.flickr.com/photos/practicalowl/392894653/
  13. 13. HTTP http://www.flickr.com/photos/practicalowl/392894653/
  14. 14. Requisição HTTP GET /search?q=phpconf HTTP/1.1 User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 Host: http://google.com Accept: text/html,application/xhtml+xml,application/xml Accept-Language: pt-br,en-us,en Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8,* Keep-Alive: 300 Connection: keep-alive http://www.flickr.com/photos/practicalowl/392894653/
  15. 15. Requisição HTTP POST /my_form.php HTTP/1.1 User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 Host: http://www.example.com Accept: text/html,application/xhtml+xml,application/xml Accept-Language: pt-br,en-us,en Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8,* Keep-Alive: 300 Connection: keep-alive campo1=valor1&campo2=valor2 http://www.flickr.com/photos/practicalowl/392894653/
  16. 16. Resposta HTTP HTTP/1.1 200 OK Date: Fri, 27 Nov 2009 13:56:40 GMT Server: Apache/2.2.14 (Unix) mod_ssl/2.2.14 OpenSSL/ 0.9.8k DAV/2 PHP/5.3.0 Transfer-Encoding: chunked Content-Type: text/html;charset=ISO-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> ... http://www.flickr.com/photos/practicalowl/392894653/
  17. 17. Resposta HTTP • Códigos HTTP • 200 - OK • 404 - Not found • 500 - Error • 503 - Forbidden http://www.flickr.com/photos/practicalowl/392894653/
  18. 18. Princípios REST http://www.flickr.com/photos/mscolly/145052885
  19. 19. 1. Sintaxe universal para identificação de recursos - URI http://www.flickr.com/photos/heather/147388906
  20. 20. E o que são esses recursos? 1. Sintaxe universal para identificação de recursos - URI http://www.flickr.com/photos/heather/147388906
  21. 21. • Tudo que é importante ao ponto de ser exposto pelo sistema na web • São os substantivos • Todo recurso tem uma URI. http://www.flickr.com/photos/heather/147388906
  22. 22. Possíveis recursos • Fotos no Flickr • Bookmarks no Delicious • Atualizações no Twitter • ... http://www.flickr.com/photos/heather/147388906
  23. 23. 2 - Um conjunto bem definido de operações http://www.flickr.com/photos/99129398@N00/255783151
  24. 24. • No mundo real existe “polimorfismo” dos verbos, assim simplificamos o nosso vocabulário com verbos genéricos que servem para vários tipos objetos, como CRIAR, PEGAR, ALTERAR, APAGAR (jogar fora) • HTTP já oferece as quatro operações que precisamos, GET, POST, PUT, DELETE. • Esses são os verbos • Assim temos uma interface padrão e genérica para todos os recursos. http://www.flickr.com/photos/99129398@N00/255783151
  25. 25. • Podemos fazer uma analogia desses verbos da seguinte maneira HTTP SQL CRUD POST INSERT CREATE GET SELECT RETRIEVE PUT UPDATE UPDATE DELETE DELETE DELETE http://www.flickr.com/photos/99129398@N00/255783151
  26. 26. 3 - Um conjunto de diversos formatos possíveis http://www.flickr.com/photos/99129398@N00/255783151
  27. 27. • Recursos são conceitos, representações são como lidamos com eles • Nem só de XML vive o REST • Qualquer formato pode ser utilizado para representar um recurso: XML, JSON, HTML, Texto puro, PDF, imagens (JPEG, PNG,...) e etc... http://www.flickr.com/photos/99129398@N00/255783151
  28. 28. 4 - Protocolo Stateless http://www.savagechickens.com/tag/amnesia
  29. 29. • Toda requisição é independente. • Toda requisição precisa conter toda informação necessária para que o processamento seja feito. • Ajuda na escalabilidade e balanceamento de carga. http://www.savagechickens.com/tag/amnesia
  30. 30. Classificação http://www.flickr.com/photos/ogil/2540634421/
  31. 31. REST-RPC (Low REST) • Utiliza principalmente o método GET para toda a API e a ação a ser tomada é descrita na própria URI. • Mais comum por ser mais fácil de implementar http://www.flickr.com/photos/ogil/2540634421/
  32. 32. RESTful (High REST) • Implementação de acordo com a tese de Roy Fielding • Utiliza os quatro verbos (GET, POST, PUT, DELETE) http://www.flickr.com/photos/ogil/2540634421/
  33. 33. • O uso correto ou não dos verbos determina se uma aplicação é considerada RESTful ou não. Não RESTful Verbo URI (substantivo) Ação POST /bookmarks/create Criar GET /bookmarks/show/1 Visualizar POST /bookmarks/update/1 Alterar GET/POST /bookmarks/delete/1 Apagar RESTful Verbo URI (substantivo) Ação POST /bookmarks Criar GET /bookmarks/1 Visualizar PUT /bookmarks/1 Alterar DELETE /bookmarks/1 Apagar http://www.flickr.com/photos/ogil/2540634421/
  34. 34. Queria ver isso funcionando...
  35. 35. Apache CouchDB • Um banco de dados orientado a documentos com interface RESTful • Os documentos são armazenados no formato JSON schema- free • Live demo! (Dêem as mãos e rezem para Murphy!)
  36. 36. Finalmente PHP... http://www.flickr.com/photos/tobiasschlitt/2644905363/
  37. 37. Implementando um cliente para o Twitter Clientes Twitter são o novo “Hello World” :-) http://www.flickr.com/photos/tobiasschlitt/2644905363/
  38. 38. Implementando um cliente para o Twitter Usaremos o Pear::HTTP_Request Clientes Twitter são o novo “Hello World” :-) http://www.flickr.com/photos/tobiasschlitt/2644905363/
  39. 39. class TwitterClient { public $login; public $senha; const API_URL = 'http://www.twitter.com/statuses/'; public function tweet($mensagem) { $conexao = new HTTP_Request(self::API_URL.'update.json'); $conexao->setBasicAuth($this->login, $this->senha); $conexao->setMethod(HTTP_REQUEST_METHOD_POST); $conexao->addPostData('status',$mensagem); if(PEAR::isError($conexao->sendRequest())) { throw new Exception($conexao->getMessage()); } } ... } http://www.flickr.com/photos/tobiasschlitt/2644905363/
  40. 40. public function timeline() { $conexao = new HTTP_Request(self::API_URL. 'home_timeline.json'); $conexao->setBasicAuth($this->login, $this->senha); $conexao->sendRequest(); $response = json_decode($conexao->getResponseBody()); foreach($response as $tweet) { printf("nMensagem: %sn Enviada por %s (%s) em %sn", $tweet->text, $tweet->user->name, $tweet->user->screen_name, date('d/m/Y H:m:s',strtotime($tweet- >created_at))); } } http://www.flickr.com/photos/tobiasschlitt/2644905363/
  41. 41. Provendo um serviço REST • É muito simples! • PHP permite que você saiba qual o método HTTP foi utilizado na requisição, acessando a variável: $_SERVER[‘REQUEST_METHOD’] • PHP tem suporte nativo aos formatos mais usuais nas APIs Rest (XML e JSON) http://www.flickr.com/photos/tobiasschlitt/2644905363/
  42. 42. Pode ser basicão... <?php switch($_SERVER['REQUEST_METHOD']) { case 'GET': //Retorna os dados... break; case 'POST': //Cria um novo registro... break; case 'PUT': //Altera o registro... break; case 'DELETE': //Apaga o registro... break; } ?> http://www.flickr.com/photos/tobiasschlitt/2644905363/
  43. 43. GET • Tudo o que você precisa está na URL • Apache mod_rewrite pode cuidar de transformar uma url amigável em parâmetros disponíveis em $_GET
  44. 44. POST • Trata-se como um formulário qualquer • Toda a informação que vem na requisição está disponível em $_POST
  45. 45. PUT • Assim como no POST, uma requisição PUT traz os dados no corpo da requisição • Mas PHP não tem o array superglobal $_PUT • Mas podemos “criá-lo” da seguinte forma: parse_str(file_get_contents("php://input"), $_PUT);
  46. 46. DELETE • No DELETE assim como no GET, o corpo da requisição não tem nada. • O recurso a ser apagado é especificado na URL
  47. 47. <?php echo "Dúvidas?"; $card = array( 'nome' => 'Felipe Ribeiro', 'site' => 'http://feliperibeiro.com', 'e-mail' => 'felipernb@php.net', 'twitter' => '@felipernb', 'fone' => '(83) 9979-3161' ); var_dump($card); ?>
  48. 48. Referências • Leonard Richardson & Sam Ruby. Restful Web Services, O’Reilly; • http://rest.blueoxen.net/cgi-bin/wiki.pl?FrontPage • http://en.wikipedia.org/wiki/REST • http://www.lornajane.net/posts/2008/PHP-Rest-Server-part-1- of-3 • Maurício Linhares , Diga não aos web services • http://www.slideshare.net/allisson/restful-web-services http://www.flickr.com/photos/nullalux/2261949240

×