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
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
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/
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/
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
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
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/
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!)
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