Post on 20-Jan-2015
description
PHP RESTful Web Services
Felipe Ribeiro - feliperibeiro.comfelipernb@gmail.comCONAPHP / CONISLI 2008
http://flickr.com/photos/estherase/128983854/
Quem é esse cabra da peste?
• Felipe Ribeiro
• Graduando em Ciência da Computação na UFCG;
• Natural de Campina Grande, PB;
• Trabalha remotamente como desenvolvedor sênior da startup Shoprizer.com, com base em Miami, FL;
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/
http://www.flickr.com/photos/jerry7171/192391979/
• 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…
O que dizem sobre o SOAP...
http://www.flickr.com/photos/jerry7171/192391979/
• Registros UDDI são tão lendários que o próximo “Jurassic Park” vai ter um;
• 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;
Mas o mundo é cruel...
REST - Representational State Transfer(Transferência de Estado Representacional)
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/
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?
http://www.flickr.com/photos/heather/147388906
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
• Fotos no Flickr
• Bookmarks no Delicious
• Atualizações no Twitter
• ...
Possíveis recursos
2 - Um conjunto bem definido de operações
http://www.flickr.com/photos/99129398@N00/255783151
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 CRUDPOST INSERT CREATEGET SELECT RETRIEVEPUT UPDATE UPDATE
DELETE DELETE DELETE
3 - Um conjunto de diversos formatos possíveis
http://www.flickr.com/photos/99129398@N00/255783151
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: HTML, Texto puro, PDF, imagens (JPEG, PNG,...) e etc...
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 Apagarhttp://www.flickr.com/photos/ogil/2540634421/
Finalmente PHP...
http://www.flickr.com/photos/tobiasschlitt/2644905363/
Implementando 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’]
• Caso a saída seja em XML, você pode usar o SimpleXML para facilitar sua vida.
http://www.flickr.com/photos/tobiasschlitt/2644905363/
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; }?>
Ou pode ser mais elaborado...
• Vamos ver como seria um sistema simples de gerenciamento de bookmarks
• Usaremos o padrão Front Controller e processaremos as requisições de acordo com o recurso que é desejado (nesse caso o recurso é o bookmark) e o método HTTP utilizado.
• Talk is cheap... Show me the code!
http://www.flickr.com/photos/tobiasschlitt/2644905363/
Consumindo um serviço REST
• Você vai precisar da libcurl, ou do pacote HTTP_REQUEST do PEAR
http://www.flickr.com/photos/tobiasschlitt/2644905363/
Perguntas?
http://www.flickr.com/photos/oberazzi/318947873
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
Obrigado!
http://www.flickr.com/photos/jaredchapman/482538719
Felipe Ribeirofelipernb@gmail.com
http://feliperibeiro.com