ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
Mini Curso Web Services com PHP
1. Minicurso
Web Services com PHP
Vinícius Costa de Souza
viniciuscs@unisinos.br
http://www.inf.unisinos.br/~vinicius
julho de 2005
2. Web Services com PHP
Apresentações
Nome
Conhecimentos sobre Web Services
Conhecimentos sobre PHP
Expectativas referentes ao curso
Vinícius Costa de Souza - Julho de 2005 / 2
3. Web Services com PHP
Programa
Introdução
Web Services
O que são?
Arquitetura
Tecnologias
XML
WSDL
SOAP
UDDI
Web Services com PHP
XML-RPC
NuSOAP
PEAR SOAP
REST
PHP Extension
Vinícius Costa de Souza - Julho de 2005 / 3
4. Web Services com PHP
Introdução
Por que surgiram os Web Services ?
Reutilização
Disponibilidade
Interoperabilidade
3.300 projetos em 2002
15,2 milhões de dólares até 2007
Vinícius Costa de Souza - Julho de 2005 / 4
5. Web Services com PHP
Web Services
O que são?
Web Services são componentes de software que
independem de implementação ou de plataforma e
podem ser descritos, publicados e invocados sobre
uma rede através de mensagens padrão XML.
Vinícius Costa de Souza - Julho de 2005 / 5
6. Web Services com PHP
Web Services
Arquitetura
Registro Descriçã
de o do
Serviços serviço
encontrar publicar
serviço
Solicitante
cliente Provedor
de
de
Serviços interagir Descrição
Serviços
do serviço
Vinícius Costa de Souza - Julho de 2005 / 6
7. Web Services com PHP
Web Services
Tecnologias
Vinícius Costa de Souza - Julho de 2005 / 7
8. Web Services com PHP
Tecnologias
XML
No contexto de Web Services, a XML não é
apenas utilizada como formato para troca de
mensagens, mas também como a forma através da
qual os serviços são definidos
Permite superar as limitações do HTML
Possibilita criar qualquer número de elementos
(tags) com significado associado às informações
Vinícius Costa de Souza - Julho de 2005 / 8
9. Web Services com PHP
Tecnologias
XML
Através de XML esquemas é possível validar as
informações separadamente e descrever os atributos e
características dos dados
Duas partes só podem trocar informações em XML e
entender os elementos da mesma forma se compartilharem
uma mesma definição sobre quais e como os elementos
podem ser utilizados
Vinícius Costa de Souza - Julho de 2005 / 9
10. Web Services com PHP
Tecnologias
WSDL
A WSDL é a linguagem padrão XML utilizada para
descrever interfaces de Web Services
A WSDL é dividida em três elementos principais:
definições de tipo de dados - determinam a estrutura
e o conteúdo das mensagens.
operações abstratas - determinam as operações
possíveis
protocolos de ligação - determinam as formas de
transmissão das mensagens pela rede até os
destinatários
Vinícius Costa de Souza - Julho de 2005 / 10
11. Web Services com PHP
Tecnologias
WSDL
Camadas de descrição dos serviços
Vinícius Costa de Souza - Julho de 2005 / 11
12. Web Services com PHP
Tecnologias
SOAP
O SOAP é um protocolo para troca de informações em
ambiente descentralizado e distribuído que permite
comunicação entre aplicações de forma simples e
completamente independente de sistema operacional,
linguagem de programação ou plataforma
A comunicação é realizada através de trocas de
mensagens, transmitidas em formato XML, incluindo os
parâmetros usados na chamada, bem como os dados de
resultados.
Também pode ser utilizado para invocar, publicar e
localizar Web Services no registro UDDI
Vinícius Costa de Souza - Julho de 2005 / 12
13. Web Services com PHP
Tecnologias
SOAP
O SOAP pode ser utilizado em combinação com uma
variedade de outros protocolos, como HTTP, SMTP, FTP,
dentre outros. Também suporta Remote Procedure Call
O modelo de dados SOAP oferece definições para tipos de
dados como string, integer, float, double e date
Vinícius Costa de Souza - Julho de 2005 / 13
14. Web Services com PHP
Tecnologias
SOAP
Um pacote SOAP possui as seguintes partes:
Envelope: define o início e o fim das mensagens, quem poderá
tratá-las e se o tratamento é obrigatório ou opcional
Cabeçalho: contém atributos opcionais das mensagens
Corpo: contém os dados em XML
Anexo: consiste de um ou mais documentos anexados a
mensagem principal
RPC: define como o modelo RPC (Remote Procedure call)
interage com o SOAP, com o objetivo de invocar procedimentos
em um sistema remoto.
Codificação: define como representar dados simples e
complexos a serem transmitidos nas mensagens
Vinícius Costa de Souza - Julho de 2005 / 14
15. Web Services com PHP
Tecnologias
SOAP
Envelope, Cabeçalho e Corpo das mensagens SOAP
Vinícius Costa de Souza - Julho de 2005 / 15
16. Web Services com PHP
Tecnologias
SOAP
Invocação do serviço utilizando SOAP
Vinícius Costa de Souza - Julho de 2005 / 16
17. Web Services com PHP
Tecnologias
UDDI
Para que um serviço seja utilizado é necessário que o
cliente consiga localizá-lo, e esta localização pode ser
feita através do UDDI, que é uma especificação técnica
para descrever, descobrir e integrar Web Services
Para isso, existe um registro global público, chamado
UDDI business registry, no qual toda a informação está
disponível para consultas em geral. Entretanto, um
registro privado pode adicionar controle de segurança
para proteger os dados e prevenir acessos não
autorizados
Vinícius Costa de Souza - Julho de 2005 / 17
18. Web Services com PHP
Tecnologias
UDDI
UDDI utilizado para descobrir um Web Service
Vinícius Costa de Souza - Julho de 2005 / 18
19. Web Services com PHP
Web Services com PHP
Possibilidades
XML-RPC
NuSOAP
PEAR SOAP
REST
SOAP Extension
Vinícius Costa de Souza - Julho de 2005 / 19
20. Web Services com PHP
Web Services com PHP
XML-RPC
Remote Procedure Calls – RPC são utilizadas para
estabelecer e facilitar transações entre dois sistemas
remotos
XML-RPC é uma implementação de RPC que
possibilita o transporte de dados em XML entre dois
servidores utilizando o protocolo HTTP
XML-RPC tollkit disponível em:
http://sourceforge.net/projects/phpxmlrpc
Versão 1.1.1 de 30/06/2005 Vinícius Costa de Souza - Julho de 2005 / 20
21. Web Services com PHP
Web Services com PHP
XML-RPC
Classes
xmlrpc_client – clientes
xmlrpc_server - servidores
xmlrpcmsg – requisições ao servidor
xmlrpcresp – respostas do servidor
xmlrpcval – encapsula valores para XML-RPC
Arquivos
xmlrpc.inc
xmlrpcs.inc
Vinícius Costa de Souza - Julho de 2005 / 21
22. Web Services com PHP
Web Services com PHP
XML-RPC
xmlrpc_server.php
<?php
include ("xmlrpc.inc");
include ("xmlrpcs.inc");
function CalculaICMS ($objeto){
$valor = $objeto->GetParam(0);
$valor_escalar = $valor->scalarval();
$valorICMS = $valor_escalar * 1.5;
return new xmlrpcresp (new xmlrpcval($valorICMS, "string"));
}
$servidor = new xmlrpc_server
(array("valorICMS.CalculaICMS"=>array("function"=>"CalculaICMS")));
?>
Vinícius Costa de Souza - Julho de 2005 / 22
23. Web Services com PHP
Web Services com PHP
XML-RPC
xmlrpc_client.php
<?php
include ("xmlrpc.inc");
$valor_nf = "15.000";
$format = new xmlrpcmsg('valorICMS.CalculaICMS',
array(new xmlrpcval($valor_nf, "double")));
$client = new xmlrpc_client("xmlrpc_server.php", "localhost", 80);
$request = $client->send($format);
$resp = $request->value();
echo $value->scalarval();
?>
Vinícius Costa de Souza - Julho de 2005 / 23
24. Web Services com PHP
Web Services com PHP
Exercícios
1. Baixar as classes XML-RPC http://sourceforge.com
3. Baixar os exemplos xmlrpc_server.php e xmlrpc_client.php
em www.inf.unisinos.br/~vinicius e testar.
Simular alguns erros com e sem a opção de debug.
5. Criar um Web Service que recebe um nome (string) e retorna
como resposta a frase “Olá nome!”.
Vinícius Costa de Souza - Julho de 2005 / 24
25. Web Services com PHP
Web Services com PHP
PEAR
PHP Extension and Application Repository
http://pear.php.net
Repositório de classes em PHP
Licença livre
Grande comunidade
PEAR SOAP Client/Server for PHP
implementação do protocolo SOAP e serviços
versão 0.9.1 Beta de 31/05/2005.
Vinícius Costa de Souza - Julho de 2005 / 25
26. Web Services com PHP
Web Services com PHP
PEAR
pear-server1.php
<?php
require_once 'SOAP/Server.php';
$server = new SOAP_Server;
class SOAP_Example_Server {
var $method_namespace = 'urn:SOAP_Example_Server';
function echoString($inputString)
{
return $inputString;
}
}
$soapclass = new SOAP_Example_Server();
$server->addObjectMap($soapclass);
$server->service($HTTP_RAW_POST_DATA);
?> Vinícius Costa de Souza - Julho de 2005 / 26
27. Web Services com PHP
Web Services com PHP
PEAR
pear-client1.php
<?php
require_once 'SOAP/Client.php';
$soapclient = new SOAP_Client('http://localhost/pear-server1.php');
$result = $soapclient->call('echoStringSimple',
array('inputString' => 'this is a test string'),
array('namespace' => 'urn:SOAP_Example_Server');
?>
Vinícius Costa de Souza - Julho de 2005 / 27
28. Web Services com PHP
Web Services com PHP
NuSOAP
API desenvolvida em PHP
Permite a criação de clientes e servidores
Possui suporte embutido a WSDL.
Instalação simplificada
servidor Web com suporte a PHP
biblioteca de classes nusoap.php
http://sourceforge.ner/projects/nusoap
A última versão estável é a 0.7.0 de 3/6/2005
Vinícius Costa de Souza - Julho de 2005 / 28
29. Web Services com PHP
Web Services com PHP
NuSOAP (exemplo 1 – Hello World)
nusoap_server1.php
<?php
// inclusão do arquivo de classes NuSOAP
require_once('nusoap.php');
// criação de uma instância do servidor
$server = new soap_server;
// registro do método
$server->register('hello');
// definição do método como uma função do PHP
function hello($name) {
return 'Hello '.$name;
}
// requisição para uso do serviço
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ?
$HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>
Vinícius Costa de Souza - Julho de 2005 / 29
30. Web Services com PHP
Web Services com PHP
NuSOAP (exemplo 1 – Hello World)
nusoap_client1.php
<?php
// inclusão do arquivo de classes NuSOAP
require_once('nusoap.php');
// criação de uma instância do cliente
$client = new soapclient('http://localhost/server1.php');
// chamada do método SOAP
$result = $client->call('hello',array('V SDSL'));
// exibe o resultado
print_r($result);
?> Vinícius Costa de Souza - Julho de 2005 / 30
31. Web Services com PHP
Web Services com PHP
NuSOAP (exemplo 2 - debug)
nusoap_client2.php
<?php
require_once('nusoap.php');
$client = new soapclient('http://localhost/server1.php');
// verifica se ocorreu erro na criação do objeto
$err = $client->getError();
if ($err){
echo "<h2>Erro no construtor</h2><pre>".$err."</pre>";
}
// chamada do método SOAP
$result = $client->call('hello',array('V SDSL'));
// verifica se ocorreu falha na chamada do método
if ($client->fault){
echo "<h2>Falha</h2><pre>";
print_r($result);
echo "</pre>"; Vinícius Costa de Souza - Julho de 2005 / 31
32. Web Services com PHP
Web Services com PHP
NuSOAP (exemplo 2 - debug)
}else{
// verifica se ocorreu erro na execução do método
$err = $client->getError();
if ($err){
echo "<h2>Erro</h2><pre>".$err."</pre>";
}else{
// exibe o resultado
echo "<h2>Result</h2><pre>".print_r($result)."</pre>";
}
}
// exibe a requisição e a resposta
echo '<h2>Requisição</h2>';
echo '<pre>'.htmlspecialchars($client->request).'</pre>';
echo '<h2>Resposta</h2>';
echo '<pre>'.htmlspecialchars($client->response).'</pre>';
// Exibe mensagens para debug
echo '<h2>Debug</h2>';
echo '<pre>'.htmlspecialchars($client->debug_str).'</pre>'
?>
Vinícius Costa de Souza - Julho de 2005 / 32
33. Web Services com PHP
Web Services com PHP
NuSOAP (exemplo 2 - debug)
Requisição
POST server1.php HTTP/1.0
User-Agent: NuSOAP/0.6.7 (1.75)
Host: localhost
Content-Type: text/xml; charset=ISO-8859-1
SOAPAction: ""
Authorization: Basic dmluaWNpdXM6dW5pc2lub3M=
Content-Length: 538
<?xml version="1.0" encoding="ISO-8859-1"?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:si="http://soapinterop.org/xsd">
<SOAP-ENV:Body>
<ns1:hello xmlns:ns1="http://testuri.org">
<soapVal xsi:type="xsd:string">III SDSL</soapVal>
</ns1:hello>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope> Vinícius Costa de Souza - Julho de 2005 / 33
34. Web Services com PHP
Web Services com PHP
NuSOAP (exemplo 3 - WSDL)
server2.php
<?php
require_once('nusoap.php');
$server = new soap_server;
// inicializa o suporte a WSDL
$server->configureWSDL('server2','urn:server2');
$server->wsdl->schemaTargetNamespace = 'urn:server2';
// registra o método a ser oferecido
$server->register('hello', //nome do método
array('name' => 'xsd:string'), //parâmetros de entrada
array('return' => 'xsd:string'), //parâmetros de saída
'urn:server2', //namespace
'urn:server2#hello', //soapaction
'rpc', //style
'encoded', //use
'Says hello to the caller' //documentação do WS
);
... Vinícius Costa de Souza - Julho de 2005 / 34
35. Web Services com PHP
Web Services com PHP
Vinícius Costa de Souza - Julho de 2005 / 35
36. Web Services com PHP
Web Services com PHP
Exercícios
1. Baixar as classes do NuSOAP http://sourceforge.net
Baixar e testar os três exemplos apresentados
http://www.inf.unisinos.br/~vinicius
2. Alterar o nusoap-server2.php para que o mesmo forneça
um novo serviço além do hello. Este novo serviço deve
ser chamado de Media e deve receber como parâmetros
de entrada dois números reais (num1 e num2) e retornar
como saída um parâmetro (resultado), que deve ser o
resultado do cálculo da média entre os dois números.
3. Criar um cliente para acessar o novo serviço
implementado
Vinícius Costa de Souza - Julho de 2005 / 36
37. Web Services com PHP
Web Services com PHP
Exercícios
1. Criar um cliente para acessar um Web Service
disponibilizado pela Amazon.com através da API NuSOAP
O web service disponibilizado pela Amazon (http:
//soap.amazon.com) permite a realização de consultas em
sua base de dados. Dessa forma, podemos incluir
fomulários para pesquisas na Amazon em nossos próprios
sites.
Vinícius Costa de Souza - Julho de 2005 / 37
38. Web Services com PHP
Web Services com PHP
Dicas
1. URL para acesso ao serviço da Amazon.com
http://soap.amazon.com/schemas3/AmazonWebServices.wsdl
2. Parâmetros a serem passados 5. Array Details
'keyword' => $palavra, 'Url‘
'page' => $pagina, 'ImageUrlSmall'
'mode' => 'books', 'ProductName‘
'tag' => 'melonfire-20', 'Authors‘
'sort' => '+pmrank', 'OurPrice'
'type' => 'lite',
'devtag' => 'YOUR-TOKEN-HERE‘
3. Nome do método a ser chamado
KeywordSearchRequest
4. Retorno
$result['Details'];
$result['TotalResults'];
Vinícius Costa de Souza - Julho de 2005 / 38
39. Web Services com PHP
Web Services com PHP
REST
O REST difere bastante do SOAP e do XML-RPC.
não é um padrão
não existem classes pré-construídas
não exige nenhuma extensão especial ou biblioteca de classes
O protocolo HTTP faz o envio e recebimento de mensagens
padrão XML.
uso de métodos padrão HTTP como o GET, POST e PUT para
enviar e recuperar dados XML.
Necessário utilizar ferramentas como PHP DOM, SAX, ou
também XSL para fazer o parsing.
Vinícius Costa de Souza - Julho de 2005 / 39
40. Web Services com PHP
Web Services com PHP
REST
rest-server.php
<?php
// obtém o valor do parâmetro passado.
$amount = $_GET["amount"];
// efetua o cálculo do imposto
$taxcalc = $amount*0.15;
// monta o XML de resposta
echo "<?xml version="1.0"?>";
echo "<taxinfo>";
echo "<result>".$taxcalc."</result>";
echo "</taxinfo>";
?>
Vinícius Costa de Souza - Julho de 2005 / 40
41. Web Services com PHP
Web Services com PHP
REST
rest-client.php
<?php
$rs = "http://localhost/rest-server.php";
$qs = "";
$param = array('amount' => "15.00");
foreach($param as $key=>$value){
$qs = $qs."$key=".urlencode($value)."&";
}
$url = "$rs?$qs";
$xml = file_get_contents($url);
echo $xml;
?>
Vinícius Costa de Souza - Julho de 2005 / 41
42. Web Services com PHP
Web Services com PHP
SOAP Extension
A extensão SOAP do PHP 5 é a primeira
implementação do protocolo SOAP para PHP em C
Possui algumas vantagens em relação a outras
implementações escritas em PHP, sendo a principal
delas a velocidade.
Essa extensão, ainda definida como experimental,
pode ser utilizada para implementar servidores e
clientes SOAP com suporte a SOAP 1.1, SOAP 1.2 e
WSDL 1.1.
Possui uma série de funções pré-definidas
Vinícius Costa de Souza - Julho de 2005 / 42
43. Web Services com PHP
Web Services com PHP
SOAP Extension
soap-server1.php
<?php
//criação de uma instância do servidor
$server = new SoapServer(null, array('uri' => "http://localhost/ws/"));
//definição do serviço
function helloWorld($name)
{
return "Hello ".$name;
}
//registro do serviço
$server->addFunction("helloWorld");
//chamada do método para atender as requisição do serviço
$server->handle();
?>
Vinícius Costa de Souza - Julho de 2005 / 43
44. Web Services com PHP
Web Services com PHP
SOAP Extension
soap-client1.php
<?php
// criação de uma instância do cliente
$client = new SoapClient(null, array(
'location' => 'http://localhost/ws/soap-server1.php',
'uri' => 'http://localhost/ws/',
'trace' => 1);
// chamada do serviço SOAP
$result = $client->helloWorld('Vinícius');
// verifica erros na execução do serviço e exibe o resultado
if (is_soap_fault($result)){
trigger_error("SOAP Fault: (faultcode: {$result->faultcode},
faultstring: {$result->faulstring})", E_ERROR);
}else{
print_r($result);
}
?>
Vinícius Costa de Souza - Julho de 2005 / 44
45. Web Services com PHP
Web Services com PHP
Exercício
1. Implementar e testar o exemplo
Vinícius Costa de Souza - Julho de 2005 / 45
46. Web Services com PHP
Referências
http://www.w3.org/2002/ws/
W3C - Web Services Activity
http://sourceforge.net/projects/nusoap/
NuSOAP project page
http://www.xmlrpc.com
Site oficial do XML-RPC
http://pear.php.net/package/SOAP
SOAP Package
http://br.php.net/manual/pt_BR/ref.soap.php
Site oficial do PHP
http://www.w3.org/TR/soap/
SOAP
http://www.w3.org/TR/wsdl
WSDL
http://www.w3.org/XML/
XML
http://www.uddi.org/
Vinícius Costa de Souza - Julho de 2005 / 46
47. Web Services com PHP
OBRIGADO!
Vinícius Costa de Souza
viniciuscs@unisinos.br
www.inf.unsinos.br/~vinicius
São Leopoldo, julho de 2005
Vinícius Costa de Souza - Julho de 2005 / 47