http://flickr.com/photos/estherase/128983854/




PHP RESTful Web Services
                       Felipe Ribeiro
          ...
Felipe Ribeiro
Graduando (concluinte) em Ciência da Computação na
UFCG
Zend Certified Engineer - PHP5
Trabalha como desenvo...
Cloud
computing




 SaaS - Software as a
 Service
Web Services
Web Services
• Web service é uma solução utilizada na integração de sistemas
  e na comunicação entre aplicações diferente...
SOAP é o padrão no
        mercado...
           http://www.flickr.com/photos/katcameron/140299496
Mas SOAP é
complicado!




              http://www.flickr.com/photos/jerry7171/192391979/
O SOAP ideal
• Primeiro, você usa UDDI para descobrir aonde estão os
  serviços que você está interessado em consumir.

• ...
Mas o mundo é cruel...
• Registros UDDI são tão lendários que está sendo produzido o
  filme: “Indiana Jones e a ilha do UD...
REST -
Representational
 State Transfer
       http://www.flickr.com/photos/practicalowl/392894653/
• REST não é um envelope XML semelhante ao SOAP


• REST não é um framework/toolkit


• REST não é padronizado pela W3C


...
• Conjunto de princípios para uma arquitetura baseada em
  como a Web funciona


• ROA - Resource Oriented Architecture (A...
HTTP




       http://www.flickr.com/photos/practicalowl/392894653/
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....
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) ...
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...
Resposta HTTP
• Códigos HTTP

  • 200 - OK

  • 404 - Not found

  • 500 - Error

  • 503 - Forbidden




                ...
Princípios REST
                  http://www.flickr.com/photos/mscolly/145052885
1. Sintaxe universal para
identificação de recursos - URI

                           http://www.flickr.com/photos/heather/1...
E o que são esses recursos?




   1. Sintaxe universal para
identificação de recursos - URI

                           ht...
• Tudo que é importante ao ponto de ser exposto pelo sistema
  na web


• São os substantivos


• Todo recurso tem uma URI...
Possíveis recursos
• Fotos no Flickr

• Bookmarks no Delicious

• Atualizações no Twitter

• ...




                     ...
2 - Um conjunto bem definido
        de operações
                    http://www.flickr.com/photos/99129398@N00/255783151
• No mundo real existe “polimorfismo” dos verbos, assim
  simplificamos o nosso vocabulário com verbos genéricos que
  serve...
• Podemos fazer uma analogia desses verbos da seguinte
  maneira



             HTTP           SQL         CRUD
         ...
3 - Um conjunto de diversos
     formatos possíveis
                  http://www.flickr.com/photos/99129398@N00/255783151
• Recursos são conceitos, representações são como lidamos
  com eles


• Nem só de XML vive o REST


• Qualquer formato po...
4 - Protocolo Stateless
               http://www.savagechickens.com/tag/amnesia
• Toda requisição é independente.


• Toda requisição precisa conter toda informação necessária
  para que o processamento...
Classificação
               http://www.flickr.com/photos/ogil/2540634421/
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 UR...
RESTful (High REST)
• Implementação de acordo com a tese de Roy Fielding

• Utiliza os quatro verbos (GET, POST, PUT, DELE...
• O uso correto ou não dos verbos determina se uma aplicação
  é considerada RESTful ou não.
                        Não R...
Queria ver isso
funcionando...
Apache CouchDB
• Um banco de dados orientado a documentos com interface
  RESTful

• Os documentos são armazenados no form...
Finalmente PHP...




                    http://www.flickr.com/photos/tobiasschlitt/2644905363/
Implementando
um cliente para o
     Twitter




 Clientes Twitter são o novo
       “Hello World” :-)
                   ...
Implementando
um cliente para o
     Twitter

                  Usaremos o
              Pear::HTTP_Request

 Clientes Twi...
class TwitterClient {

  public $login;
  public $senha;
  const API_URL = 'http://www.twitter.com/statuses/';

  public f...
public function timeline() {
   $conexao = new HTTP_Request(self::API_URL.
                'home_timeline.json');
   $cone...
Provendo um serviço REST
• É muito simples!

• PHP permite que você saiba qual o método HTTP foi utilizado
  na requisição...
Pode ser basicão...
     <?php

     switch($_SERVER['REQUEST_METHOD']) {
        case 'GET':
           //Retorna os dado...
GET
• Tudo o que você precisa está na URL

• Apache mod_rewrite pode cuidar de transformar uma url
  amigável em parâmetro...
POST
• Trata-se como um formulário qualquer

• Toda a informação que vem na requisição está disponível em
  $_POST
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...
DELETE
• No DELETE assim como no GET, o corpo da requisição não
  tem nada.

• O recurso a ser apagado é especificado na URL
<?php
echo "Dúvidas?";

$card = array(
    'nome' => 'Felipe Ribeiro',
    'site' => 'http://feliperibeiro.com',
    'e-ma...
Referências
• Leonard Richardson & Sam Ruby. Restful Web Services,
  O’Reilly;

• http://rest.blueoxen.net/cgi-bin/wiki.pl...
PHP RESTful Web Services - PHPConf'09
PHP RESTful Web Services - PHPConf'09
Próximos SlideShares
Carregando em…5
×

PHP RESTful Web Services - PHPConf'09

8.443 visualizações

Publicada em

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

Publicada em: Tecnologia
0 comentários
17 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
8.443
No SlideShare
0
A partir de incorporações
0
Número de incorporações
2.437
Ações
Compartilhamentos
0
Downloads
268
Comentários
0
Gostaram
17
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide
  • 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

    ×