SlideShare uma empresa Scribd logo
1 de 50
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

Mais conteúdo relacionado

Mais procurados

Android webservice
Android webserviceAndroid webservice
Android webserviceAlan Echer
 
Criando e consumindo Web Services (REST) com o CakePHP
Criando e consumindo Web Services (REST) com o CakePHPCriando e consumindo Web Services (REST) com o CakePHP
Criando e consumindo Web Services (REST) com o CakePHP2km interativa!
 
De Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupDe Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupWagner Roberto dos Santos
 
Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na AbrilComo um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na AbrilLuis Cipriani
 
Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0jesuinoPower
 
Como um grande sistema REST funciona - arquitetura e desempenho
Como um grande sistema REST funciona - arquitetura e desempenhoComo um grande sistema REST funciona - arquitetura e desempenho
Como um grande sistema REST funciona - arquitetura e desempenhoDavid Robert Camargo de Campos
 
Introdução a Web Services
Introdução a Web ServicesIntrodução a Web Services
Introdução a Web ServicesFabio Leal
 
Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]
Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]
Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]Carl Edwin
 
Web services, aplicações, acesso a aplicações, XML, API
Web services, aplicações, acesso a aplicações, XML, APIWeb services, aplicações, acesso a aplicações, XML, API
Web services, aplicações, acesso a aplicações, XML, APINuno Pereira
 
Sistemas Distribuídos - Big Web Services
Sistemas Distribuídos - Big Web ServicesSistemas Distribuídos - Big Web Services
Sistemas Distribuídos - Big Web ServicesKeyo Galvao
 
Case CMS Abril - System of Systems e Arquitetura (quase) Caótica.
Case CMS Abril - System of Systems e Arquitetura (quase) Caótica.Case CMS Abril - System of Systems e Arquitetura (quase) Caótica.
Case CMS Abril - System of Systems e Arquitetura (quase) Caótica.David Lojudice Sobrinho
 
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...Luis Cipriani
 
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...Tchelinux
 
Interagindo com web services RPC, SOAP e REST utilizando PHP
Interagindo com web services RPC, SOAP e REST utilizando PHPInteragindo com web services RPC, SOAP e REST utilizando PHP
Interagindo com web services RPC, SOAP e REST utilizando PHPEduardo Cesar
 
Web 2.0 e RIA com PHP
Web 2.0 e RIA com PHPWeb 2.0 e RIA com PHP
Web 2.0 e RIA com PHPAdler Medrado
 
Web Services (in portuguese)
Web Services (in portuguese)Web Services (in portuguese)
Web Services (in portuguese)Bruno Pedro
 

Mais procurados (20)

Android webservice
Android webserviceAndroid webservice
Android webservice
 
Criando e consumindo Web Services (REST) com o CakePHP
Criando e consumindo Web Services (REST) com o CakePHPCriando e consumindo Web Services (REST) com o CakePHP
Criando e consumindo Web Services (REST) com o CakePHP
 
De Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupDe Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações Mashup
 
Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na AbrilComo um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
 
Web Services Rest
Web Services RestWeb Services Rest
Web Services Rest
 
Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0
 
Como um grande sistema REST funciona - arquitetura e desempenho
Como um grande sistema REST funciona - arquitetura e desempenhoComo um grande sistema REST funciona - arquitetura e desempenho
Como um grande sistema REST funciona - arquitetura e desempenho
 
Introdução a Web Services
Introdução a Web ServicesIntrodução a Web Services
Introdução a Web Services
 
Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]
Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]
Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]
 
Rest
RestRest
Rest
 
Web services, aplicações, acesso a aplicações, XML, API
Web services, aplicações, acesso a aplicações, XML, APIWeb services, aplicações, acesso a aplicações, XML, API
Web services, aplicações, acesso a aplicações, XML, API
 
Rest Teoria E Pratica
Rest Teoria E PraticaRest Teoria E Pratica
Rest Teoria E Pratica
 
Sistemas Distribuídos - Big Web Services
Sistemas Distribuídos - Big Web ServicesSistemas Distribuídos - Big Web Services
Sistemas Distribuídos - Big Web Services
 
Case CMS Abril - System of Systems e Arquitetura (quase) Caótica.
Case CMS Abril - System of Systems e Arquitetura (quase) Caótica.Case CMS Abril - System of Systems e Arquitetura (quase) Caótica.
Case CMS Abril - System of Systems e Arquitetura (quase) Caótica.
 
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
 
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...
 
Interagindo com web services RPC, SOAP e REST utilizando PHP
Interagindo com web services RPC, SOAP e REST utilizando PHPInteragindo com web services RPC, SOAP e REST utilizando PHP
Interagindo com web services RPC, SOAP e REST utilizando PHP
 
Arquitetura
 Arquitetura Arquitetura
Arquitetura
 
Web 2.0 e RIA com PHP
Web 2.0 e RIA com PHPWeb 2.0 e RIA com PHP
Web 2.0 e RIA com PHP
 
Web Services (in portuguese)
Web Services (in portuguese)Web Services (in portuguese)
Web Services (in portuguese)
 

Semelhante a PHP RESTful Web Services

Diapositivos práticos - Integração de Sistemas.pdf
Diapositivos práticos - Integração de Sistemas.pdfDiapositivos práticos - Integração de Sistemas.pdf
Diapositivos práticos - Integração de Sistemas.pdfJ0071
 
Webservices em PHP e a liberdade da Web
Webservices em PHP e a liberdade da WebWebservices em PHP e a liberdade da Web
Webservices em PHP e a liberdade da WebAlexandre Andrade
 
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkMario Guedes
 
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]Igor Santos
 
Construindo APIs RESTful com Spring
Construindo APIs RESTful com SpringConstruindo APIs RESTful com Spring
Construindo APIs RESTful com SpringMateus Malaquias
 
Do Rest Ao Restfull - Rio Jug
Do Rest Ao Restfull - Rio JugDo Rest Ao Restfull - Rio Jug
Do Rest Ao Restfull - Rio JugSergio Azevedo
 
Introdução à Servlets e JSP
Introdução à Servlets e JSPIntrodução à Servlets e JSP
Introdução à Servlets e JSPledsifes
 
Rest Java One
Rest Java OneRest Java One
Rest Java OneDextra
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPArlindo Santos
 
Integrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSONIntegrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSONMario Guedes
 
Desenvolvimento web em java com JSP e Servlets
Desenvolvimento web em java com JSP e ServletsDesenvolvimento web em java com JSP e Servlets
Desenvolvimento web em java com JSP e ServletsIgo Coelho
 
AspNet 5 & Redis - Escalando sua performance
AspNet 5 & Redis - Escalando sua performanceAspNet 5 & Redis - Escalando sua performance
AspNet 5 & Redis - Escalando sua performanceJosé Roberto Araújo
 
A Biblioteca cURL
A Biblioteca cURLA Biblioteca cURL
A Biblioteca cURLricardophp
 
Desenvolvimento web ágil com python e web2py
Desenvolvimento web ágil com python e web2pyDesenvolvimento web ágil com python e web2py
Desenvolvimento web ágil com python e web2pyRelsi Maron
 

Semelhante a PHP RESTful Web Services (20)

Diapositivos práticos - Integração de Sistemas.pdf
Diapositivos práticos - Integração de Sistemas.pdfDiapositivos práticos - Integração de Sistemas.pdf
Diapositivos práticos - Integração de Sistemas.pdf
 
Webservices REST com Zend Framework
Webservices REST com Zend FrameworkWebservices REST com Zend Framework
Webservices REST com Zend Framework
 
Webservices em PHP e a liberdade da Web
Webservices em PHP e a liberdade da WebWebservices em PHP e a liberdade da Web
Webservices em PHP e a liberdade da Web
 
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST Framework
 
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
 
Construindo APIs RESTful com Spring
Construindo APIs RESTful com SpringConstruindo APIs RESTful com Spring
Construindo APIs RESTful com Spring
 
Do Rest Ao Restfull - Rio Jug
Do Rest Ao Restfull - Rio JugDo Rest Ao Restfull - Rio Jug
Do Rest Ao Restfull - Rio Jug
 
Introdução à Servlets e JSP
Introdução à Servlets e JSPIntrodução à Servlets e JSP
Introdução à Servlets e JSP
 
Rest Java One
Rest Java OneRest Java One
Rest Java One
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHP
 
Integrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSONIntegrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSON
 
Desenvolvimento web em java com JSP e Servlets
Desenvolvimento web em java com JSP e ServletsDesenvolvimento web em java com JSP e Servlets
Desenvolvimento web em java com JSP e Servlets
 
Introdução APIs RESTful
Introdução APIs RESTfulIntrodução APIs RESTful
Introdução APIs RESTful
 
REST com Python
REST com PythonREST com Python
REST com Python
 
AspNet 5 & Redis - Escalando sua performance
AspNet 5 & Redis - Escalando sua performanceAspNet 5 & Redis - Escalando sua performance
AspNet 5 & Redis - Escalando sua performance
 
Rest workshop
Rest workshopRest workshop
Rest workshop
 
Construindo um sistema distribuido usando rest
Construindo um sistema distribuido usando restConstruindo um sistema distribuido usando rest
Construindo um sistema distribuido usando rest
 
Introdução a Framework Flask
Introdução a Framework FlaskIntrodução a Framework Flask
Introdução a Framework Flask
 
A Biblioteca cURL
A Biblioteca cURLA Biblioteca cURL
A Biblioteca cURL
 
Desenvolvimento web ágil com python e web2py
Desenvolvimento web ágil com python e web2pyDesenvolvimento web ágil com python e web2py
Desenvolvimento web ágil com python e web2py
 

Mais de Felipe Ribeiro

Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHPFelipe Ribeiro
 
Software livre e padrões abertos no desenvolvimento Web
Software livre e padrões abertos no desenvolvimento WebSoftware livre e padrões abertos no desenvolvimento Web
Software livre e padrões abertos no desenvolvimento WebFelipe Ribeiro
 
PHP Jedi - Boas Práticas e Alta Performance
PHP Jedi - Boas Práticas e Alta PerformancePHP Jedi - Boas Práticas e Alta Performance
PHP Jedi - Boas Práticas e Alta PerformanceFelipe Ribeiro
 
PHP para aplicações Web de grande porte
PHP para aplicações Web  de grande portePHP para aplicações Web  de grande porte
PHP para aplicações Web de grande porteFelipe Ribeiro
 

Mais de Felipe Ribeiro (6)

SPL Datastructures
SPL DatastructuresSPL Datastructures
SPL Datastructures
 
Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHP
 
PHP 5.3 - What's new?
PHP 5.3 - What's new?PHP 5.3 - What's new?
PHP 5.3 - What's new?
 
Software livre e padrões abertos no desenvolvimento Web
Software livre e padrões abertos no desenvolvimento WebSoftware livre e padrões abertos no desenvolvimento Web
Software livre e padrões abertos no desenvolvimento Web
 
PHP Jedi - Boas Práticas e Alta Performance
PHP Jedi - Boas Práticas e Alta PerformancePHP Jedi - Boas Práticas e Alta Performance
PHP Jedi - Boas Práticas e Alta Performance
 
PHP para aplicações Web de grande porte
PHP para aplicações Web  de grande portePHP para aplicações Web  de grande porte
PHP para aplicações Web de grande porte
 

PHP RESTful Web Services

  • 1. http://flickr.com/photos/estherase/128983854/ PHP RESTful Web Services 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
  • 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. SOAP é o padrã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 State Transfer 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 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. HTTP http://www.flickr.com/photos/practicalowl/392894653/
  • 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. 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. 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. Resposta HTTP • Códigos HTTP • 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 universal para identificação de recursos - URI http://www.flickr.com/photos/heather/147388906
  • 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. • 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 • Fotos no Flickr • Bookmarks no Delicious • Atualizações no Twitter • ... http://www.flickr.com/photos/heather/147388906
  • 23. 2 - Um conjunto bem definido de operações http://www.flickr.com/photos/99129398@N00/255783151
  • 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. • 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. 3 - Um conjunto de diversos formatos possíveis http://www.flickr.com/photos/99129398@N00/255783151
  • 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. 4 - Protocolo Stateless 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 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/
  • 35.
  • 36.
  • 37. 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!)
  • 38. Finalmente PHP... http://www.flickr.com/photos/tobiasschlitt/2644905363/
  • 39. Implementando um cliente para o Twitter Clientes Twitter são o novo “Hello World” :-) http://www.flickr.com/photos/tobiasschlitt/2644905363/
  • 40. 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/
  • 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ç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/
  • 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 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
  • 46. POST • Trata-se como um formulário qualquer • Toda a informação que vem na requisição está disponível em $_POST
  • 47. 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);
  • 48. DELETE • No DELETE assim 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