Minicurso
Web Services com PHP

   Vinícius Costa de Souza
           viniciuscs@unisinos.br
     http://www.inf.unisinos.br/~vinicius


               julho de 2005
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
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
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
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
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
Web Services com PHP




                       Web Services
       Tecnologias




                                      Vinícius Costa de Souza - Julho de 2005 / 7
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
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
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
Web Services com PHP




                       Tecnologias
       WSDL

       Camadas de descrição dos serviços




                                            Vinícius Costa de Souza - Julho de 2005 / 11
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
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
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
Web Services com PHP



                       Tecnologias
       SOAP

       Envelope, Cabeçalho e Corpo das mensagens SOAP




                                     Vinícius Costa de Souza - Julho de 2005 / 15
Web Services com PHP



                       Tecnologias
       SOAP

       Invocação do serviço utilizando SOAP




                                        Vinícius Costa de Souza - Julho de 2005 / 16
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
Web Services com PHP



                       Tecnologias
       UDDI

       UDDI utilizado para descobrir um Web Service




                                      Vinícius Costa de Souza - Julho de 2005 / 18
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Web Services com PHP



                       Web Services com PHP




                                       Vinícius Costa de Souza - Julho de 2005 / 35
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
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
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
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
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
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
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
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
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
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
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
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

Mini Curso Web Services com PHP

  • 1.
    Minicurso Web Services comPHP Vinícius Costa de Souza viniciuscs@unisinos.br http://www.inf.unisinos.br/~vinicius julho de 2005
  • 2.
    Web Services comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP Web Services Tecnologias Vinícius Costa de Souza - Julho de 2005 / 7
  • 8.
    Web Services comPHP 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 comPHP 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 comPHP 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 comPHP Tecnologias WSDL  Camadas de descrição dos serviços Vinícius Costa de Souza - Julho de 2005 / 11
  • 12.
    Web Services comPHP 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 comPHP 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 comPHP 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 comPHP Tecnologias SOAP  Envelope, Cabeçalho e Corpo das mensagens SOAP Vinícius Costa de Souza - Julho de 2005 / 15
  • 16.
    Web Services comPHP Tecnologias SOAP Invocação do serviço utilizando SOAP Vinícius Costa de Souza - Julho de 2005 / 16
  • 17.
    Web Services comPHP 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 comPHP Tecnologias UDDI UDDI utilizado para descobrir um Web Service Vinícius Costa de Souza - Julho de 2005 / 18
  • 19.
    Web Services comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP Web Services com PHP Vinícius Costa de Souza - Julho de 2005 / 35
  • 36.
    Web Services comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP 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 comPHP Web Services com PHP Exercício 1. Implementar e testar o exemplo Vinícius Costa de Souza - Julho de 2005 / 45
  • 46.
    Web Services comPHP 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 comPHP 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