Minicurso Vinícius Costa de Souza viniciuscs@unisinos.br http://www.inf.unisinos.br/~vinicius julho de 2005
Apresentações Nome Conhecimentos sobre Web Services Conhecimentos sobre PHP Expectativas referentes ao curso Vinícius Costa de Souza - Julho de 2005 / 2
Programa Introdução Web Services O que são? Arquitetura Tecnologias XML WSDL SOAP UDDI XML-RPC NuSOAP PEAR SOAP REST PHP Extension Vinícius Costa de Souza - Julho de 2005 / 3
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
O que são? Web Services 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
Arquitetura Web Services Registro de Serviços Descriçã o do serviço encontrar publicar cliente Solicitante de Serviços interagir Provedor de Serviços serviço Descrição do serviço Vinícius Costa de Souza - Julho de 2005 / 6
Tecnologias Web Services Vinícius Costa de Souza - Julho de 2005 / 7
XML Tecnologias 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
XML Tecnologias 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
WSDL Tecnologias 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
WSDL Tecnologias Camadas de descrição dos serviços Vinícius Costa de Souza - Julho de 2005 / 11
SOAP Tecnologias 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
SOAP Tecnologias 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
SOAP Tecnologias 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
SOAP Tecnologias Envelope, Cabeçalho e Corpo das mensagens SOAP Vinícius Costa de Souza - Julho de 2005 / 15
SOAP Tecnologias Invocação do serviço utilizando SOAP Vinícius Costa de Souza - Julho de 2005 / 16
UDDI Tecnologias 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
UDDI Tecnologias UDDI utilizado para descobrir um Web Service Vinícius Costa de Souza - Julho de 2005 / 18
Possibilidades XML-RPC NuSOAP PEAR SOAP REST SOAP Extension Vinícius Costa de Souza - Julho de 2005 / 19
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Vinícius Costa de Souza - Julho de 2005 / 35
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
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
Dicas 1. URL para acesso ao serviço da Amazon.com http://soap.amazon.com/schemas3/amazonwebservices.wsdl 2. Parâmetros 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 método a ser chamado KeywordSearchRequest 4. Retorno $result['details']; $result['totalresults']; Vinícius Costa de Souza - Julho de 2005 / 38
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
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
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
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
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
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
Exercício 1. Implementar e testar o exemplo Vinícius Costa de Souza - Julho de 2005 / 45
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
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