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




PHP RESTful Web Services
                       Felipe Ribeiro
                 felipernb@php.net
            http://feliperibeiro.com
                          @felipernb
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
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 diferentes.

• Padrões Abertos

• Independência

  • Sistema Operacional

  • Linguagem de Programação
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.

• 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/
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/
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




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

  • 200 - OK

  • 404 - Not found

  • 500 - Error

  • 503 - Forbidden




                      http://www.flickr.com/photos/practicalowl/392894653/
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/147388906
E o que são esses recursos?




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

                           http://www.flickr.com/photos/heather/147388906
• 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
Possíveis recursos
• Fotos no Flickr

• Bookmarks no Delicious

• Atualizações no Twitter

• ...




                            http://www.flickr.com/photos/heather/147388906
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
  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
• 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
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 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
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 seja feito.


• Ajuda na escalabilidade e balanceamento de carga.




                                                 http://www.savagechickens.com/tag/amnesia
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 URI.

• Mais comum por ser mais fácil de implementar




                                                 http://www.flickr.com/photos/ogil/2540634421/
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/
• 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/
Queria ver isso
funcionando...
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!)
Finalmente PHP...




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




 Clientes Twitter são o novo
       “Hello World” :-)
                               http://www.flickr.com/photos/tobiasschlitt/2644905363/
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/
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/
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/
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/
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/
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
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 $_PUT

• Mas podemos “criá-lo” da seguinte forma:

parse_str(file_get_contents("php://input"), $_PUT);
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-mail' => 'felipernb@php.net',
    'twitter' => '@felipernb',
    'fone' => '(83) 9979-3161'
);
var_dump($card);
?>
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

PHP RESTful Web Services - PHPConf'09

  • 1.
    http://flickr.com/photos/estherase/128983854/ PHP RESTful WebServices Felipe Ribeiro felipernb@php.net http://feliperibeiro.com @felipernb
  • 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.
    Cloud computing SaaS -Software as a Service
  • 4.
  • 5.
    Web Services • Webservice é 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.
    SOAP é opadrão no mercado... http://www.flickr.com/photos/katcameron/140299496
  • 7.
    Mas SOAP é complicado! http://www.flickr.com/photos/jerry7171/192391979/
  • 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.
    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.
    REST - Representational StateTransfer http://www.flickr.com/photos/practicalowl/392894653/
  • 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.
    • Conjunto deprincí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.
    HTTP http://www.flickr.com/photos/practicalowl/392894653/
  • 14.
    Requisição HTTP GET /search?q=phpconfHTTP/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.
    Requisição HTTP POST /my_form.phpHTTP/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.
    Resposta HTTP HTTP/1.1 200OK 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.
    Resposta HTTP • CódigosHTTP • 200 - OK • 404 - Not found • 500 - Error • 503 - Forbidden http://www.flickr.com/photos/practicalowl/392894653/
  • 18.
    Princípios REST http://www.flickr.com/photos/mscolly/145052885
  • 19.
    1. Sintaxe universalpara identificação de recursos - URI http://www.flickr.com/photos/heather/147388906
  • 20.
    E o quesão esses recursos? 1. Sintaxe universal para identificação de recursos - URI http://www.flickr.com/photos/heather/147388906
  • 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.
    Possíveis recursos • Fotosno Flickr • Bookmarks no Delicious • Atualizações no Twitter • ... http://www.flickr.com/photos/heather/147388906
  • 23.
    2 - Umconjunto bem definido de operações http://www.flickr.com/photos/99129398@N00/255783151
  • 24.
    • No mundoreal 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.
    • Podemos fazeruma 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.
    3 - Umconjunto de diversos formatos possíveis http://www.flickr.com/photos/99129398@N00/255783151
  • 27.
    • Recursos sãoconceitos, 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.
    4 - ProtocoloStateless http://www.savagechickens.com/tag/amnesia
  • 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.
    Classificação http://www.flickr.com/photos/ogil/2540634421/
  • 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.
    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.
    • O usocorreto 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.
  • 37.
    Apache CouchDB • Umbanco 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!)
  • 38.
    Finalmente PHP... http://www.flickr.com/photos/tobiasschlitt/2644905363/
  • 39.
    Implementando um cliente parao Twitter Clientes Twitter são o novo “Hello World” :-) http://www.flickr.com/photos/tobiasschlitt/2644905363/
  • 40.
    Implementando um cliente parao Twitter Usaremos o Pear::HTTP_Request Clientes Twitter são o novo “Hello World” :-) http://www.flickr.com/photos/tobiasschlitt/2644905363/
  • 41.
    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/
  • 42.
    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/
  • 43.
    Provendo um serviçoREST • É 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/
  • 44.
    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/
  • 45.
    GET • Tudo oque você precisa está na URL • Apache mod_rewrite pode cuidar de transformar uma url amigável em parâmetros disponíveis em $_GET
  • 46.
    POST • Trata-se comoum formulário qualquer • Toda a informação que vem na requisição está disponível em $_POST
  • 47.
    PUT • Assim comono 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);
  • 48.
    DELETE • No DELETEassim como no GET, o corpo da requisição não tem nada. • O recurso a ser apagado é especificado na URL
  • 49.
    <?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); ?>
  • 50.
    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