Você está na página 1de 12

Webservices

Índices - André Restivo 1


Webservices

● Um sistema de software desenhado de forma


a permitir interacções máquina-máquina
através da web.
● Protocolos mais usados:
● SOAP
● XMLRPC
● REST

Índices - André Restivo 2


SOAP

● Começou por se chamar Simple Object Access


Protocol.
● Neste momento é uma recomendação W3C.
● Protocolo baseado em XML.
● Não está limitado a HTTP.
● Foi desenvolvido com o apoio da Microsoft.
● Bastante mais poderoso e complexo que
XMLRPC.

Índices - André Restivo 3


SOAP Mensagens

Índices - André Restivo 4


XMLRPC

● XML Remote Procedure Call


● Um formato XML muito simples que permite
invocar métodos à distância via web.
● É o percursor do SOAP.
● Podemos usar a biblioteca XML-RPC for PHP:
● http://phpxmlrpc.sourceforge.net/
● Ou do PEAR:
● http://pear.php.net/package/XML_RPC/

Índices - André Restivo 5


XMLRPC Mensagens

Índices - André Restivo 6


XMLRPC Server - Exemplo

include_once('includes/base.php');
include_once('XML/Server.php');
include_once('database/empregado.php');

function getEmpregadoById($msg) {
$p_id = $msg->getParam(0);
$v_id = XML_RPC_Decode($p_id);
$empregado = Empregado::getById($v_id);
$resp = XML_RPC_encode($empregado);
return new XML_RPC_Response($resp);
}

$server = new XML_RPC_Server(


array(
'getEmpregadoById' => array('function' => 'getEmpregadoById')
)
);

Índices - André Restivo 7


XMLRPC Client - Exemplo

require_once 'XML/RPC.php';

$params = array(new XML_RPC_Value(3, 'int'));


$msg = new XML_RPC_Message('getEmpregadoById', $params);

$cli = new XML_RPC_Client('/~arestivo/siem/empregado.xmlrpc.php', 'gnomo.fe.up.pt');


//$cli->setDebug(1);

$resp = $cli->send($msg);

if (!$resp) {
echo 'Communication error: ' . $cli->errstr;
die;
}

if (!$resp->faultCode()) {
$val = $resp->value();
$data = XML_RPC_decode($val);
print_r($data);
} else {
echo 'Fault Code: ' . $resp->faultCode() . "\n";
echo 'Fault Reason: ' . $resp->faultString() . "\n";
}

Índices - André Restivo 8


REST

● Representational State Transfer


● Cada recurso do SGBD tem um URL bem definido.
● Exemplos:
● http://exemplo.com/empregados.php
● http://exemplo.com/empregado.php?id=1
● Usa os comandos definidos no protocolo HTTP para
manipular e transferir esses mesmos recurso: PUT/GET/
DELETE/POST
● O retorno de uma chamada por REST também pode usar
os códigos de resposta HTTP para indicar se a operação
foi, ou não, bem sucedida: 200, 201, 404, ...
● Os dados podem ser codificados usando, por exemplo,
XML ou JSON.
Índices - André Restivo 9
REST

● Significado dos comandos HTTP no contexto


do REST para colecções:
– GET (listar os elementos)
– PUT (substitui a colecção por outra)
– POST (criar uma nova entrada na colecção)
– DELETE (apagar a colecção)
● Significado dos comandos HTTP no contexto
do REST para elementos:
– GET (dados do elemento)
– PUT (update ou criar um novo elemento)
– POST (acrescentar um filho ao elemento)
– DELETE (apagar o elemento)

Índices - André Restivo 10


REST

● Significado das respostas HTTP no contexto do


REST:
● 200 (ok) - Sucesso
● 201 (created) – Recurso criado
● 400 (bad request) – Vários tipos de erro
● 403 (forbidden) – Não tem permissão
● 404 (not found) – Recurso não existe
● Respostas HTTP possíveis:
– http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

Índices - André Restivo 11


REST e PHP

● Podemos saber qual o método HTTP usado:


● $_SERVER['REQUEST_METHOD'];
● Enviar códigos de resposta HTML no header:
● header('HTTP/1.1 404 Not Found');
● Fazer pedidos HTTP usando a biblioteca HTTP_REQUEST2 do
PEAR:
$request = new
HTTP_Request2('http://www.example.com/empregado.php');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->addPostParameter('id', 1);
$request->addPostParameter(array( 'nome' => 'João', 'depid' => 1));
$response = $request->send();
echo $response-> getStatus();

● http://pear.php.net/package/HTTP_Request2/
Índices - André Restivo 12