You are on page 1of 47

Minicurso Web Services com PHP

Vincius Costa de Souza


viniciuscs@unisinos.br http://www.inf.unisinos.br/~vinicius julho de 2005

Web Services com PHP

Apresentaes
Nome Conhecimentos sobre Web Services Conhecimentos sobre PHP Expectativas referentes ao curso

Vincius Costa de Souza - Julho de 2005 / 2

Web Services com PHP

Programa
Introduo Web Services O que so? Arquitetura Tecnologias XML WSDL SOAP UDDI Web Services com PHP

XML-RPC NuSOAP PEAR SOAP REST PHP Extension

Vincius Costa de Souza - Julho de 2005 / 3

Web Services com PHP

Introduo
Por que surgiram os Web Services ?

Reutilizao Disponibilidade Interoperabilidade 3.300 projetos em 2002 15,2 milhes de dlares at 2007
Vincius Costa de Souza - Julho de 2005 / 4

Web Services com PHP

Web Services
O que so?

Web Services so componentes de software que independem de implementao ou de plataforma e podem ser descritos, publicados e invocados sobre uma rede atravs de mensagens padro XML.

Vincius Costa de Souza - Julho de 2005 / 5

Web Services com PHP

Web Services
Arquitetura
Descri o do servio publicar

Registro de Servios encontrar

cliente

Solicitante de Servios

servio interagir Provedor de Servios

Descrio do servio

Vincius Costa de Souza - Julho de 2005 / 6

Web Services com PHP

Web Services
Tecnologias

Vincius Costa de Souza - Julho de 2005 / 7

Web Services com PHP

Tecnologias
XML

No contexto de Web Services, a XML no


apenas utilizada como formato para troca de mensagens, mas tambm como a forma atravs da qual os servios so definidos Permite superar as limitaes do HTML Possibilita criar qualquer nmero de elementos (tags) com significado associado s informaes

Vincius Costa de Souza - Julho de 2005 / 8

Web Services com PHP

Tecnologias
XML

Atravs de XML esquemas possvel validar as informaes separadamente e descrever os atributos e caractersticas dos dados Duas partes s podem trocar informaes em XML e entender os elementos da mesma forma se compartilharem uma mesma definio sobre quais e como os elementos podem ser utilizados

Vincius Costa de Souza - Julho de 2005 / 9

Web Services com PHP

Tecnologias
WSDL

A WSDL a linguagem padro XML utilizada para descrever interfaces de Web Services A WSDL dividida em trs elementos principais: definies de tipo de dados - determinam a estrutura e o contedo das mensagens. operaes abstratas - determinam as operaes possveis protocolos de ligao - determinam as formas de transmisso das mensagens pela rede at os destinatrios
Vincius Costa de Souza - Julho de 2005 / 10

Web Services com PHP

Tecnologias
WSDL

Camadas de descrio dos servios

Vincius Costa de Souza - Julho de 2005 / 11

Web Services com PHP

Tecnologias
SOAP

O SOAP um protocolo para troca de informaes em ambiente descentralizado e distribudo que permite comunicao entre aplicaes de forma simples e completamente independente de sistema operacional, linguagem de programao ou plataforma A comunicao realizada atravs de trocas de mensagens, transmitidas em formato XML, incluindo os parmetros usados na chamada, bem como os dados de resultados. Tambm pode ser utilizado para invocar, publicar e localizar Web Services no registro UDDI
Vincius Costa de Souza - Julho de 2005 / 12

Web Services com PHP

Tecnologias
SOAP

O SOAP pode ser utilizado em combinao com uma variedade de outros protocolos, como HTTP, SMTP, FTP, dentre outros. Tambm suporta Remote Procedure Call O modelo de dados SOAP oferece definies para tipos de dados como string, integer, float, double e date

Vincius Costa de Souza - Julho de 2005 / 13

Web Services com PHP

Tecnologias
SOAP Um pacote SOAP possui as seguintes partes: Envelope: define o incio e o fim das mensagens, quem poder trat-las e se o tratamento obrigatrio ou opcional Cabealho: contm atributos opcionais das mensagens Corpo: contm 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. Codificao: define como representar dados simples e complexos a serem transmitidos nas mensagens
Vincius Costa de Souza - Julho de 2005 / 14

Web Services com PHP

Tecnologias
SOAP

Envelope, Cabealho e Corpo das mensagens SOAP

Vincius Costa de Souza - Julho de 2005 / 15

Web Services com PHP

Tecnologias
SOAP

Invocao do servio utilizando SOAP

Vincius Costa de Souza - Julho de 2005 / 16

Web Services com PHP

Tecnologias
UDDI

Para que um servio seja utilizado necessrio que o

cliente consiga localiz-lo, e esta localizao pode ser feita atravs do UDDI, que uma especificao tcnica para descrever, descobrir e integrar Web Services Para isso, existe um registro global pblico, chamado UDDI business registry, no qual toda a informao est disponvel para consultas em geral. Entretanto, um registro privado pode adicionar controle de segurana para proteger os dados e prevenir acessos no autorizados
Vincius Costa de Souza - Julho de 2005 / 17

Web Services com PHP

Tecnologias
UDDI

UDDI utilizado para descobrir um Web Service

Vincius Costa de Souza - Julho de 2005 / 18

Web Services com PHP

Web Services com PHP


Possibilidades

XML-RPC NuSOAP PEAR SOAP REST SOAP Extension

Vincius Costa de Souza - Julho de 2005 / 19

Web Services com PHP

Web Services com PHP


XML-RPC

Remote Procedure Calls RPC so utilizadas para estabelecer e facilitar transaes entre dois sistemas remotos XML-RPC uma implementao de RPC que possibilita o transporte de dados em XML entre dois servidores utilizando o protocolo HTTP XML-RPC tollkit disponvel em: http://sourceforge.net/projects/phpxmlrpc Verso 1.1.1 de 30/06/2005
Vincius Costa de Souza - Julho de 2005 / 20

Web Services com PHP

Web Services com PHP


XML-RPC

Classes
xmlrpc_client clientes xmlrpc_server - servidores xmlrpcmsg requisies ao servidor xmlrpcresp respostas do servidor xmlrpcval encapsula valores para XML-RPC

Arquivos xmlrpc.inc xmlrpcs.inc


Vincius Costa de Souza - Julho de 2005 / 21

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"))); ?>
Vincius Costa de Souza - Julho de 2005 / 22

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(); ?>
Vincius Costa de Souza - Julho de 2005 / 23

Web Services com PHP

Web Services com PHP


Exerccios 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 opo de debug. 5. Criar um Web Service que recebe um nome (string) e retorna como resposta a frase Ol nome!.

Vincius Costa de Souza - Julho de 2005 / 24

Web Services com PHP

Web Services com PHP


PEAR

PHP Extension and Application Repository http://pear.php.net Repositrio de classes em PHP Licena livre Grande comunidade PEAR SOAP Client/Server for PHP implementao do protocolo SOAP e servios verso 0.9.1 Beta de 31/05/2005.
Vincius Costa de Souza - Julho de 2005 / 25

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); ?>


Vincius Costa de Souza - Julho de 2005 / 26

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'); ?>

Vincius Costa de Souza - Julho de 2005 / 27

Web Services com PHP

Web Services com PHP


NuSOAP

API desenvolvida em PHP Permite a criao de clientes e servidores Possui suporte embutido a WSDL. Instalao simplificada servidor Web com suporte a PHP biblioteca de classes nusoap.php http://sourceforge.ner/projects/nusoap A ltima verso estvel a 0.7.0 de 3/6/2005
Vincius Costa de Souza - Julho de 2005 / 28

Web Services com PHP

Web Services com PHP


NuSOAP (exemplo 1 Hello World)
nusoap_server1.php

<?php // incluso do arquivo de classes NuSOAP require_once('nusoap.php'); // criao de uma instncia do servidor $server = new soap_server; // registro do mtodo $server->register('hello'); // definio do mtodo como uma funo do PHP function hello($name) { return 'Hello '.$name; } // requisio para uso do servio $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ''; $server->service($HTTP_RAW_POST_DATA);
Vincius Costa de Souza - Julho de 2005 / 29

?>

Web Services com PHP

Web Services com PHP


NuSOAP (exemplo 1 Hello World)
nusoap_client1.php

<?php // incluso do arquivo de classes NuSOAP require_once('nusoap.php'); // criao de uma instncia do cliente $client = new soapclient('http://localhost/server1.php'); // chamada do mtodo SOAP $result = $client->call('hello',array('V SDSL')); // exibe o resultado print_r($result); ?>
Vincius Costa de Souza - Julho de 2005 / 30

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 criao do objeto $err = $client->getError(); if ($err){ echo "<h2>Erro no construtor</h2><pre>".$err."</pre>"; } // chamada do mtodo SOAP $result = $client->call('hello',array('V SDSL')); // verifica se ocorreu falha na chamada do mtodo if ($client->fault){ echo "<h2>Falha</h2><pre>"; print_r($result); Vincius Costa de Souza - Julho de 2005 / 31 echo "</pre>";

Web Services com PHP

Web Services com PHP


NuSOAP (exemplo 2 - debug)

}else{ // verifica se ocorreu erro na execuo do mtodo $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 requisio e a resposta echo '<h2>Requisio</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>'


Vincius Costa de Souza - Julho de 2005 / 32

Web Services com PHP

Web Services com PHP


NuSOAP (exemplo 2 - debug)
Requisio
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> Vincius Costa de Souza - Julho de 2005 / 33

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 mtodo a ser oferecido $server->register('hello', //nome do mtodo array('name' => 'xsd:string'), //parmetros de entrada array('return' => 'xsd:string'), //parmetros de sada 'urn:server2', //namespace 'urn:server2#hello', //soapaction 'rpc', //style 'encoded', //use 'Says hello to the caller' //documentao do WS );
Vincius Costa de Souza - Julho de 2005 / 34

...

Web Services com PHP

Web Services com PHP

Vincius Costa de Souza - Julho de 2005 / 35

Web Services com PHP

Web Services com PHP


Exerccios 1. Baixar as classes do NuSOAP http://sourceforge.net Baixar e testar os trs exemplos apresentados http://www.inf.unisinos.br/~vinicius 2. Alterar o nusoap-server2.php para que o mesmo fornea um novo servio alm do hello. Este novo servio deve ser chamado de Media e deve receber como parmetros de entrada dois nmeros reais (num1 e num2) e retornar como sada um parmetro (resultado), que deve ser o resultado do clculo da mdia entre os dois nmeros. 3. Criar um cliente para acessar o novo servio implementado

Vincius Costa de Souza - Julho de 2005 / 36

Web Services com PHP

Web Services com PHP


Exerccios 1. Criar um cliente para acessar um Web Service disponibilizado pela Amazon.com atravs da API NuSOAP O web service disponibilizado pela Amazon (http: //soap.amazon.com) permite a realizao de consultas em sua base de dados. Dessa forma, podemos incluir fomulrios para pesquisas na Amazon em nossos prprios sites.

Vincius Costa de Souza - Julho de 2005 / 37

Web Services com PHP

Web Services com PHP


Dicas 1. URL para acesso ao servio da Amazon.com
http://soap.amazon.com/schemas3/AmazonWebServices.wsdl

2. Parmetros a serem passados


'keyword' => $palavra, 'page' => $pagina, 'mode' => 'books', 'tag' => 'melonfire-20', 'sort' => '+pmrank', 'type' => 'lite', 'devtag' => 'YOUR-TOKEN-HERE

5. Array Details
'Url 'ImageUrlSmall' 'ProductName 'Authors 'OurPrice'

3. Nome do mtodo a ser chamado


KeywordSearchRequest

4. Retorno
$result['Details']; $result['TotalResults'];
Vincius Costa de Souza - Julho de 2005 / 38

Web Services com PHP

Web Services com PHP


REST O REST difere bastante do SOAP e do XML-RPC. no um padro no existem classes pr-construdas no exige nenhuma extenso especial ou biblioteca de classes O protocolo HTTP faz o envio e recebimento de mensagens padro XML. uso de mtodos padro HTTP como o GET, POST e PUT para enviar e recuperar dados XML. Necessrio utilizar ferramentas como PHP DOM, SAX, ou tambm XSL para fazer o parsing.
Vincius Costa de Souza - Julho de 2005 / 39

Web Services com PHP

Web Services com PHP


REST
rest-server.php <?php // obtm o valor do parmetro passado. $amount = $_GET["amount"]; // efetua o clculo do imposto $taxcalc = $amount*0.15; // monta o XML de resposta echo "<?xml version=\"1.0\"?>"; echo "<taxinfo>"; echo "<result>".$taxcalc."</result>"; echo "</taxinfo>";

?>

Vincius Costa de Souza - Julho de 2005 / 40

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;

Vincius Costa de Souza - Julho de 2005 / 41

Web Services com PHP

Web Services com PHP


SOAP Extension

A extenso SOAP do PHP 5 a primeira implementao do protocolo SOAP para PHP em C Possui algumas vantagens em relao a outras implementaes escritas em PHP, sendo a principal delas a velocidade. Essa extenso, 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 srie de funes pr-definidas
Vincius Costa de Souza - Julho de 2005 / 42

Web Services com PHP

Web Services com PHP


SOAP Extension
soap-server1.php <?php //criao de uma instncia do servidor $server = new SoapServer(null, array('uri' => "http://localhost/ws/")); //definio do servio function helloWorld($name) { return "Hello ".$name; } //registro do servio $server->addFunction("helloWorld"); //chamada do mtodo para atender as requisio do servio $server->handle(); ?>
Vincius Costa de Souza - Julho de 2005 / 43

Web Services com PHP

Web Services com PHP


SOAP Extension
soap-client1.php
<?php // criao de uma instncia do cliente $client = new SoapClient(null, array( 'location' => 'http://localhost/ws/soap-server1.php', 'uri' => 'http://localhost/ws/', 'trace' => 1); // chamada do servio SOAP $result = $client->helloWorld('Vincius');

?>

// verifica erros na execuo do servio 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); }
Vincius Costa de Souza - Julho de 2005 / 44

Web Services com PHP

Web Services com PHP


Exerccio 1. Implementar e testar o exemplo

Vincius Costa de Souza - Julho de 2005 / 45

Web Services com PHP

Referncias
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/

Vincius Costa de Souza - Julho de 2005 / 46

Web Services com PHP

OBRIGADO!

Vincius Costa de Souza


viniciuscs@unisinos.br www.inf.unsinos.br/~vinicius

So Leopoldo, julho de 2005

Vincius Costa de Souza - Julho de 2005 / 47